求助:add-hook 如何在major-mode变化之后自动脱钩呢?

如题:比如我现在使用org mode (add-hook 'org-mode-hook 'test-function) 如何在进入elpy-mode的时候不使用test-function?

你的 test-function 只会在 org-mode 启动时执行,并没有跟着 elpy-mode 执行,如果你的要求是进入 elpy-mode 不要再执行一次 test-function,现在的就可以了。

但这不意味着,在 org-mode buffer 中执行的 test-function 不会影响到 elpy-mode buffer。

得看你的 test-function 具体都干了什么,如果只是做了些 buffer-local 的动作,那是不会影响到 elpy-mode的,如果做了些 global change,eply-mode也会受到影响。

哦,原来如此,那我如果要在major-mode变化之后运行某个function应该用什么函数?有监控当前major-mode是否变化的函数么?

M-x describe-variable 关键词 change major hook , 你能看到你想要的

嗯,谢谢。那么如何查看当前的active minor mode呢?这个我谷歌了好久也没有答案。

我在李杀的网站上看到是(boundp MinorMode同名变量 ) 但是尝试以后发现在org mode 情况下lsp似乎也可以得到t的答案。

boundp是叫这个名字的变量或函数有没有bind,约等于当前有没有load过(例如)lsp。所以一load之后org buffer里也是t。minor mode启动时会set local的同名变量,所以你应该看lsp-mode的值

bound-and-true-p

如果你是指查看当前buffer有哪些active minor mode(不是用lisp),可以C-h m里,会列出来的,如果是指在lisp里,可以用minor-mode-alist这个变量。或者可以用with-current-buffer在里面去判断minor mode那个绑定

哦 load(加载)不是每个buffer重新加载一次么?我以为每次都要重新来呢。

(bound-and-true-p lsp-interaction-mode) 在scratch 当中使用的时候现实nil是怎么回事?lsp-interaction-mode难道不是他的模式吗?

bound-and-true-p is a Lisp macro in ‘bindings.el’.

(bound-and-true-p VAR)

Return the value of symbol VAR if it is bound, else nil. 这里的var是变量的意思吗?

Return the value of symbol VAR 

'lisp-interaction-mode 代表同名全局变量的 symbol

lisp-interaction-mode 是直接返回这个全局变量里存放的值。

所以应该用

(bound-and-true-p 'lisp-interaction-mode)

其实我一开始是像你那样写的,结果报错了,然后我谷歌以后发现应该是用不带“‘”符号的才对。也就是 (bound-and-true-p lisp-interaction-mode) 我昨晚又尝试了一下,发现好像是因为lisp-interaction-mode是major-mode,而该函数似乎是能够反馈minor-mode的函数。因为我用不带单引号的,显示的是nil。

1 个赞

喔,没注意到bound-and-true-p是宏,那就不要quote了

major mode用derived-mode-p

(derived-mode-p 'lisp-interaction-mode)
;; => lisp-interaction-mode

(derived-mode-p 'org-mode)
;; => nil