emacs在编程模式下只删除尾部空白的地方。

问题描述 投票:4回答:5

下面的一行在保存时删除了所有训练的空白处。

(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)

不在编程模式下的不停止。

emacs whitespace mode
5个回答
9
投票

让钩子变量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-trimws-butler 来以更聪明的方式处理这个问题。

盲目地从文件中删除所有的尾部空白是一种很好的方式,会导致大量不相关的行提交到版本控制库中。上面提到的两个库都可以保证你的提交没有尾部空白。 也会在文件的其他地方引入不必要的修改。


3
投票

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)

1
投票

是的,因为只要你进入一个 prog-mode 模式,您可以将该函数添加到 write-file-hooks的地方。 而这个钩子适用于写入任何文件,无论其缓冲区的模式如何。

与其把那个简单的函数放在钩子上,你可以添加一个测试模式的函数,只有当你想这样做的时候,才会进行删除空白的操作。

不然的话,你就需要让 write-file-hooks


0
投票

你需要让变量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 而不是你想做的事情。


-1
投票

在emacs 21或更高版本中,你可以将这个钩子添加到一个特定的模式中,就像这样。

(add-hook 'prog-mode-hook
                (lambda () (add-to-list 'write-file-functions 'delete-trailing-whitespace)))
© www.soinside.com 2019 - 2024. All rights reserved.