以前是会提示下还有进程,现在是把 vterm buffer 放后台了,一开始没注意,然后发现我开了十几个 vterm 没关。。。
FYI, 问题修正了: fix(lib): provided-mode-derived-p calls on Emacs <=29 · doomemacs/doomemacs@ba511fc · GitHub
DeepSeek 解释的,可怕的 Elisp 。。。
这个补丁是为了解决 provided-mode-derived-p函数在 Emacs 30.1 版本中签名变化导致的兼容性问题。
补丁目的
确保 Doom Emacs 在 Emacs ≤29 和 ≥30.1 版本上都能正常工作。Emacs 30.1 修改了 provided-mode-derived-p函数的参数签名:
-
旧签名(30.1之前):
(mode &rest modes) -
新签名(30.1及以后):
(mode &optional modes &rest old-modes)
具体修改
补丁修改了两个文件中的三处调用:
- lisp/lib/buffers.el(第97-98行)
; 原代码
(provided-mode-derived-p (buffer-local-value 'major-mode buf) 'special-mode)
; 新代码(格式调整,实质未变)
(provided-mode-derived-p (buffer-local-value 'major-mode buf)
'special-mode)
- lisp/lib/buffers.el(第153-155行)
; 原代码
(provided-mode-derived-p (buffer-local-value 'major-mode buf)
doom-real-buffer-modes)
; 新代码
(apply #'provided-mode-derived-p (buffer-local-value 'major-mode buf)
doom-real-buffer-modes)
- lisp/lib/indent.el(第33行)
; 原代码
(provided-mode-derived-p mode doom-indent-excluded-modes)
; 新代码
(apply #'provided-mode-derived-p mode doom-indent-excluded-modes)
技术原理
关键变化是使用 apply函数调用 provided-mode-derived-p:
-
apply函数将列表参数展开为单个参数传递给目标函数 -
这样做可以同时兼容新旧两种签名:
-
在 Emacs ≤29 上,
(apply #'provided-mode-derived-p mode modes)等价于(provided-mode-derived-p mode modes) -
在 Emacs ≥30.1 上,
apply能正确处理新的可选参数结构
-
兼容性考虑
-
向前兼容:确保代码在未来的 Emacs 版本中继续工作
-
向后兼容:不影响现有 Emacs 29 及以下版本的使用
-
修复问题:解决了 issue #8721 中报告的相关错误
这个补丁体现了 Doom Emacs 维护者对跨版本兼容性的重视,通过最小的代码改动确保了用户在不同 Emacs 版本间升级时的平滑体验。