emacs:是pre-save-hook一个局部变量?

Che*_*eso 11 emacs elisp

我怎么知道这个?

我添加delete-trailing-whitespace到了before-save-hook我的内容中c-mode-common-hook,但看起来delete-trailing-whitespace每个文件都被调用,而不仅仅是使用c-mode和衍生文件的缓冲区.

我可以将before-save-hook缓冲区设为本地吗?

Eme*_*gul 20

write-contents-functions改为添加:

(add-hook 'c-mode-common-hook
  (lambda()
    (add-hook 'write-contents-functions
      (lambda()
        (save-excursion
          (delete-trailing-whitespace)))
      nil t)))
Run Code Online (Sandbox Code Playgroud)

正如Emacs Lisp参考手册所述:

这与写文件函数一样,但它适用于与缓冲区内容有关的钩子,而不是特定的访问文件或其位置.这种钩子通常由主要模式设置,作为此变量的缓冲区本地绑定.无论何时设置,该变量都会自动变为缓冲区本地; 切换到新的主模式始终会重置此变量,但调用set-visited-file-name则不会.

这在Emacs 24.2.1中适用于我(即,它从C文件中删除所有尾随空格,但保留所有其他文件类型中的尾随空格).


alg*_*gal 18

不,变量before-save-hook本身不是缓冲区.变量的文档并没有说它是本地的缓冲区,或者说它在设置时会自动变为缓冲区本地.

如果要为其添加缓冲区本地挂钩,正确的方法是使用标准add-hook函数的可选LOCAL参数:

(add-hook 'before-save-hook 'foo nil t)
Run Code Online (Sandbox Code Playgroud)

add-hook文档说:

可选的第四个参数LOCAL,如果是非nil,则表示修改hook的缓冲区本地值而不是其全局值.这使得hook buffer-local,并使它成为缓冲区本地值的ta成员.它充当一个标志来运行全局值的钩子函数以及本地值.

local-write-file-hooks我相信,选择添加它的答案是错误的.如果你查看该函数的文档,在emacs 24.3上,它说该变量从22.1开始已经过时了,你应该使用write-file-functions.如果您查找文档write-file-functions,它会描述更复杂的行为,并在最后说"要在保存缓冲区之前执行各种检查或更新,请使用`before-save-hook'".

  • 有一个问题,我什至会说这是关于“LOCAL”参数的错误。您会看到,使用非零“LOCAL”调用会创建*新的空*变量,然后将您的钩子添加到该变量中。也就是说,如果您有任何其他钩子,它们将消失在缓冲区中。因此,您可能会想使用“make-local-variable”,然后使用普通的“add-hook”,而不需要任何额外的参数。 (3认同)