比如我现在想禁用recentf-mode
,在配置里写上(recentf-mode nil)
后仍然会启用。我怀疑是其他配置跟他挂了钩子,但是分段注释掉之后仍然每次启用,很奇怪。
后来就想查看这个mode对应的hook都有哪些,然后反过来remove-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,两个都不生效,还以为是一样的 ;之前确实也不太清楚,每次改配置总是两个都试试……
在我这儿,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)
然后重启等出错看调用栈。