org-mode-hook 必须手动启用org-mode才能生效

目前的情况是:

打开org-mode文件,自动加载org-mode,查看org-mode-hook,值为config中设置的(自动加载real-auto-save-mode等)。但是org-mode-hook并没有生效(org-mode文件并没有启用real-auto-save-mode)。

当前文件手动执行org-mode,org-mode-hook中的函数才生效。

似乎org-mode-hook的定义没有问题,但是生效的时机不对。直觉与doom-emacs有关,但是回滚过多个版本但没有生效

环境如下:

  • GNU Emacs v29.3 nil
  • Doom core 5da8304c4(2024-07-01), 03d692f12(2023-12-08)
  • Org-mode: 9.8(39272e2), 9.6.15

现在不太有调试思路,恳请指教!

org-mode 是通过 define-derived-mode 定义的

define-derived-mode 里通过 run-mode-hooks 来执行对应 mode 的 hook

所以,edebug-defun run-mode-hooks 跟踪一下,应该能看到你定义的 hook 中的函数有没有被执行。

感谢提供思路,现在定位到问题是因为我修改了doom中的hook:

(defalias '+org--restart-mode-h #'ignore)

因为启用该功能,在使用org-capture时无法正常格式化,所以参考Capture template 'X': Wrong type argument: stringp, nil · Issue #4832 · doomemacs/doomemacs · GitHub 进行了此项设置。

但是禁用该功能之后,导致doom在switch buffer时不会restart org-mode。而restart org-mode时会加载org-mode-hook,否则org-mode-hook失效。这就导致了本帖所说的问题。

看来简单粗暴地禁用是不行的,我现在要想办法解决org-capture无法正常格式化的问题…… 感觉hook 导致的问题比普通函数要难排查

我的是这样设置

(eval-after-load 'org-mode
   ;; [[https://emacs.stackexchange.com/questions/30613/adding-modifying-todo-keywords][org mode - Adding/Modifying TODO keywords - Emacs Stack Exchange]]
   ;;org-todo-keywords 有 bug, 需要restart
   (progn
     (when (derived-mode-p 'org-mode)
       (org-mode-restart)
       )
     (require 'org-eldoc)
   )
   )