doom upgrade 后 workspace 的标签页关闭时不会提醒关闭 vterm 了

以前是会提示下还有进程,现在是把 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)

具体修改

补丁修改了两个文件中的三处调用:

  1. 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)
  1. 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)
  1. 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能正确处理新的可选参数结构

兼容性考虑

  1. 向前兼容:确保代码在未来的 Emacs 版本中继续工作

  2. 向后兼容:不影响现有 Emacs 29 及以下版本的使用

  3. 修复问题:解决了 issue #8721 中报告的相关错误

这个补丁体现了 Doom Emacs 维护者对跨版本兼容性的重视,通过最小的代码改动确保了用户在不同 Emacs 版本间升级时的平滑体验。