下面的一行在保存时删除了所有训练的空白处。
(add-hook 'write-file-hooks 'delete-trailing-whitespace)
但我想只在编程模式下才使用这个功能,所以我做了以下的操作
(defun nuke_traling ()
(add-hook 'write-file-hooks 'delete-trailing-whitespace)
)
(add-hook 'prog-mode-hook 'nuke_traling)
不在编程模式下的不停止。
让钩子变量buffer-local已经被提及。不要这样做。或者说,不要用 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
和胡安里昂一起 before-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 来以更聪明的方式处理这个问题。
盲目地从文件中删除所有的尾部空白是一种很好的方式,会导致大量不相关的行提交到版本控制库中。上面提到的两个库都可以保证你的提交没有尾部空白。橆 也会在文件的其他地方引入不必要的修改。
write-file-hooks
自Emacs-22以来已被淘汰,取而代之的是 write-file-functions
. 但这个钩子用起来有点讲究(因为它也可以用来。表演 写),所以我建议你使用 before-save-hook
来代替。 如果想让它只适用于当前的缓冲区,只需为下面的 local
的论点 add-hook
,因为。
(defun nuke_traling ()
(add-hook 'before-save-hook #'delete-trailing-whitespace nil t))
(add-hook 'prog-mode-hook #'nuke_traling)
是的,因为只要你进入一个 prog-mode
模式,您可以将该函数添加到 write-file-hooks
的地方。 而这个钩子适用于写入任何文件,无论其缓冲区的模式如何。
与其把那个简单的函数放在钩子上,你可以添加一个测试模式的函数,只有当你想这样做的时候,才会进行删除空白的操作。
不然的话,你就需要让 write-file-hooks
你需要让变量buffer成为本地变量。
(defun nuke_traling ()
(make-variable-buffer-local 'write-file-hooks)
(add-hook 'write-file-hooks 'delete-trailing-whitespace))
但我建议你使用 before-save-hook
代替。
(defun nuke_traling ()
(add-to-list 'before-save-hook 'delete-trailing-whitespace))
write-file-hooks
如果作为文件本地变量使用,可能会有风险,文件建议使用 before-save-hook
而不是你想做的事情。
在emacs 21或更高版本中,你可以将这个钩子添加到一个特定的模式中,就像这样。
(add-hook 'prog-mode-hook
(lambda () (add-to-list 'write-file-functions 'delete-trailing-whitespace)))