为什么我的模式特定.emacs挂钩运行所有模式?

时间:2012-09-04 21:07:12

标签: emacs lisp hook

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

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

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

(defun my-hook () ... )

但是,即使我处于不同的模式,my-hook中的内容也会在保存时运行。我错过了一步吗?

3 个答案:

答案 0 :(得分:5)

你应该使用add-hook的LOCAL参数,这将确保钩子只影响当前缓冲区:

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

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

(defun my-hook () ...)

答案 1 :(得分:2)

我认为在(add-hook 'after-save-hook 'my-hook)中调用load-hooks会为所有模式添加钩子。也就是说,一旦调用该函数,也会为每个其他缓冲区修改after-save-hook

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

答案 2 :(得分:0)

Tikhon关于'影响所有模式的后保存挂钩'是正确的 - 我现在依靠使用以下功能进行检查:

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

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