为什么我的模式特定.emacs钩子在所有模式下都运行?

为什么我的模式特定.emacs钩子在所有模式下都运行?,emacs,lisp,hook,Emacs,Lisp,Hook,我正在.emacs文件中运行以下代码: (defun load-hooks () (add-hook 'after-save-hook 'my-hook)) (add-hook 'c-mode-hook 'load-hooks) (defun my-hook () ... ) 但是,myhook中的内容在save上运行,即使我处于不同的模式。我是否遗漏了一个步骤?我认为在加载钩子中调用(在保存钩子后添加钩子)会将钩子添加到所有模式。也就是说,一旦调用了该函数,save hook之后

我正在.emacs文件中运行以下代码:

(defun load-hooks ()
    (add-hook 'after-save-hook 'my-hook))

(add-hook 'c-mode-hook 'load-hooks)

(defun my-hook () ... )

但是,
myhook
中的内容在save上运行,即使我处于不同的模式。我是否遗漏了一个步骤?

我认为在
加载钩子中调用
(在保存钩子后添加钩子)
会将钩子添加到所有模式。也就是说,一旦调用了该函数,save hook之后的
也会针对其他缓冲区进行修改


我怀疑你的钩子不会运行,除非你打开一个c文件。尝试在没有打开任何c文件的情况下打开一些文件,看看是否有任何东西在运行。如果不是,这只是意味着为c文件运行的函数会修改其他所有文件的保存钩子。

Tikhon关于“保存钩子后影响所有模式”的说法是正确的-我现在依靠使用以下函数的检查:

(defun in-c-mode? ()
  (string= (current-major-mode) "c-mode"))

(defun current-major-mode ()
  (with-current-buffer (current-buffer) major-mode))

您应该使用本地参数来添加钩子,这将确保钩子只影响当前缓冲区:

(defun load-hooks ()
  (add-hook 'after-save-hook 'my-hook nil t))

(add-hook 'c-mode-hook 'load-hooks)

(defun my-hook () ...)

砰的一声-我是否可以在保存后为c模式创建一个仅挂钩?我现在正在测试当前模式是否处于c模式。我将发布一个答案。没有必要为此定义两个新函数。我认为
(eq主模式'c-模式)
应该是一个足够的测试。请注意,
(使用当前缓冲区(当前缓冲区)…
是冗余的,基本上等同于
(progn…
。谢谢,我的答案是双重冗余的,我可以传递一个本地钩子参数。比我的答案好得多。