2

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

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

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

(defun my-hook () ... )

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

4

3 回答 3

5

您应该使用 LOCAL 参数add-hook,这将确保挂钩仅影响当前缓冲区:

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

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

(defun my-hook () ...)
于 2012-09-04T21:39:09.173 回答
2

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

我怀疑除非你打开 ac 文件,否则你的钩子不会运行。尝试在没有打开任何 c 文件的情况下打开一些文件,看看是否有任何运行。如果不是,则仅表示为 c 文件运行的函数会修改其他所有内容的保存挂钩。

于 2012-09-04T21:11:30.147 回答
0

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

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

(defun current-major-mode ()
  (with-current-buffer (current-buffer) major-mode))
于 2012-09-04T21:28:13.953 回答