已经提到了使钩子变量缓冲区本地化。不要那样做。或者更确切地说,不要使用make-local-variable
.
正常的钩子机制具有内置的缓冲区本地支持——这LOCAL
就是add-hook
. 当钩子运行时,它同时运行全局值和缓冲区局部值。
因此,以问题中的示例代码为例,您可以将其更改为使用:
(add-hook 'write-file-hooks 'delete-trailing-whitespace nil t)
然后delete-trailing-whitespace
无论何时运行都会被调用write-file-hooks
,但仅在prog-mode-hook
已运行的缓冲区中调用。
然而,有更好的方法来实现这一点。
我同意 Drew 的观点,您最好测试一下您的模式是否源自prog-mode
,并且使用 juanleonbefore-save-hook
是一个更好的使用钩子。所以你可能会做类似的事情:
(add-hook 'before-save-hook 'my-prog-nuke-trailing-whitespace)
(defun my-prog-nuke-trailing-whitespace ()
(when (derived-mode-p 'prog-mode)
(delete-trailing-whitespace)))
但我真正推荐的是使用ws-trim或ws-butler以更智能的方式处理这个问题。
盲目地从文件中删除所有尾随空格是结束将大量不相关行提交到版本控制存储库的好方法。提到的两个库都将确保您自己的提交没有尾随空格,而不会在文件的其他地方引入不需要的修改。