我怎么知道这个?
我添加delete-trailing-whitespace
到了before-save-hook
我的内容中c-mode-common-hook
,但看起来delete-trailing-whitespace
每个文件都被调用,而不仅仅是使用c-mode和衍生文件的缓冲区.
我可以将before-save-hook
缓冲区设为本地吗?
write-contents-functions
改为添加:
(add-hook 'c-mode-common-hook (lambda() (add-hook 'write-contents-functions (lambda() (save-excursion (delete-trailing-whitespace))) nil t)))
正如Emacs Lisp参考手册所述:
这与写文件函数一样,但它适用于与缓冲区内容有关的钩子,而不是特定的访问文件或其位置.这种钩子通常由主要模式设置,作为此变量的缓冲区本地绑定.无论何时设置,该变量都会自动变为缓冲区本地; 切换到新的主模式始终会重置此变量,但调用set-visited-file-name则不会.
这在Emacs 24.2.1中适用于我(即,它从C文件中删除所有尾随空格,但保留所有其他文件类型中的尾随空格).
不,变量before-save-hook
本身不是缓冲区.变量的文档并没有说它是本地的缓冲区,或者说它在设置时会自动变为缓冲区本地.
如果要为其添加缓冲区本地挂钩,正确的方法是使用标准add-hook
函数的可选LOCAL参数:
(add-hook 'before-save-hook 'foo nil t)
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'".