怎样查看当前mode都有哪些hook?

比如我现在想禁用recentf-mode,在配置里写上(recentf-mode nil)后仍然会启用。我怀疑是其他配置跟他挂了钩子,但是分段注释掉之后仍然每次启用,很奇怪。

后来就想查看这个mode对应的hook都有哪些,然后反过来remove-hook,但是没查到查看的方法;还是说我这个思路本身就跑偏了?

谢谢!

禁用某个mode , 不是使用 (xx-mode -1) 吗?

mode 对应的 hook 是指当 mode 运行时,会执行 hook 中的代码。查看 某个确定的 hook 中包含的代码,可以直接查看这个 hook 变量的值 。

如楼上所说,关闭一个 Minor Mode 用 0 或者负数,其它值包括 nil 一般表示禁用。看文档和源代码(把 define-minor-mode 宏展开)可以确认这一点。

Major 和 Minor mode 要区分。一般 mode hook 指的是 Major mode 的。hook 就是 Lisp 变量,用 C-h v 查看值。Global 和 Buffer-local minor mode 要区分,Global mode 一般不会用 mode hook 来启动,比如 recentf-mode 是个 global mode,你不会把它加到 mode hook 上。

recentf-mode的话,我试了mode 后边写 -1 和 nil,两个都不生效,还以为是一样的 :sweat_smile: ;之前确实也不太清楚,每次改配置总是两个都试试……

在我这儿,recentf-mode-hook是这样的:

recentf-mode-hook is a variable defined in ‘recentf.el’. Its value is nil

C-h m 之后,关于recentf是这样说的:

Recentf minor mode (no indicator): … …

结合楼上的回复,我就更迷惑了……

可能我elisp的基础不够,之前理解得不对。我以为hook的作用是,运行某个mode后,会加载其hook到的另外的mode,我本来想能不能把这种联系断开,从而达到禁用某个mode的效果。

你真正的问题是找到谁启用了 mode 吧。

可以试试 debug,在配置最开始的地方写下:

(debug-on-entry #'recentf-mode)

然后重启等出错看调用栈。

2赞