emacs-根据emacs的编译时间执行代码
又一次例行更新Melpa之后,发现在org文件中 C-c C-q 的tag页面无法补全了。由于我用的 vertico ,经过一番查找,发现了事情的来龙去脉。
1. vertico失效的来龙去脉
在Emacs 30及更早版本中, completing-read-multiple 函数不会向用户提示可以完成多个字符串。vertico的作者minad于2025年2月就提交过补丁,并写在了README里面。
时间快进到2026年2月8日,emacs官方repo终于合并了这个补丁。于是minad很高兴,于2026年2月9日修改了vertico的代码,以支持最新的变更。
遗憾的是,我用的emacs编译于2026年2月4日,因此恰好错过了最新的Emacs源码,所以我们需要想个办法保持兼容性。
需要注意的是,只有用最新Emacs和最新版package的才需要担心这些。如果你用的Melpa-stable、GNU Elpa等源,默认就是release之后才会提交新版本的。当然,代价就是很多package开发者懒得打release,所以可能数月甚至数年才会更新一次。
2. 根据编译时间执行代码
既然已经确定了变更时间点和变更内容,接下来就简单了。我们找到旧版代码,然后将其稍微包装,添加到配置中:
(use-package vertico
:demand t :ensure t
:config
(when (and emacs-build-time
;; vertico变更时间点
(not (time-less-p (encode-time 0 0 0 8 2 2026) emacs-build-time)))
;; Emacs 编译于 2026-02-08 之前 需要使用旧版vertico代码
(define-minor-mode vertico-mode
"VERTical Interactive COmpletion."
:global t :group 'vertico
(dolist (fun '(completing-read-default completing-read-multiple))
(if vertico-mode
(advice-add fun :around #'vertico--advice)
(advice-remove fun #'vertico--advice)))))
(vertico-mode 1)
这里我们获取到 emacs-build-time 的变量,并把他与我们指定的时间2026年2月8日做比较。如果指定时间 > build-time,则执行后续步骤,恢复旧版的 vertico-mode 代码。
然后在这一步执行完毕之后,再启动 vertico-mode 。