在编程模式下保存时,emacs 仅删除尾随空格

标签 emacs whitespace mode

以下行在保存时删除了所有训练空白。

(add-hook 'write-file-hooks 'delete-trailing-whitespace)

但我只想在我处于编程模式时才 Hook 这个功能,所以我做到了
(defun nuke_traling ()
  (add-hook 'write-file-hooks 'delete-trailing-whitespace) 
)

(add-hook 'prog-mode-hook 'nuke_traling)

不停止不处于编程模式。

最佳答案

已经提到了使钩子(Hook)变量缓冲区本地化。不要那样做。或者更确切地说,不要使用 make-local-variable .
正常的钩子(Hook)机制有内置的缓冲区本地支持——这就是 LOCAL 的目的。 add-hook 的参数.当钩子(Hook)运行时,它同时运行全局值和缓冲区局部值。
因此,以问题中的示例代码为例,您可以将其更改为使用:

(add-hook 'write-file-hooks 'delete-trailing-whitespace nil t)
然后 delete-trailing-whitespace将在任何时候调用 write-file-hooks已运行,但仅在 prog-mode-hook 所在的缓冲区中运行。跑了。
然而,有更好的方法来实现这一点。
我同意 Drew 的观点,您最好测试一下您的模式是否源自 prog-mode , 和 juanleon 说 before-save-hook是一个更好的使用钩子(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以更聪明的方式解决这个问题。
盲目地从文件中删除所有尾随空格是结束将大量不相关行提交到版本控制存储库的好方法。提到的两个库都将确保您自己的提交没有尾随空格,而不会在文件的其他地方引入不需要的修改。

关于在编程模式下保存时,emacs 仅删除尾随空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19174302/

相关文章:

mariadb - 在 MariaDB 上禁用严格模式

emacs - 我可以使用来自同一个 emacs 的两种不同的 lisp+slime/swanks 吗?

shell - 用空格替换制表符以保持 n 空间对齐

mysql - MySQL中没有子查询字段的模式计算?

emacs - 确定 Emacs 23 中当前模式源代码的路径

emacs - 防止 emacs 混用制表符和空格?

emacs - 如何使用行 + 文件引用从 emacs 缓冲区复制/粘贴区域?

emacs - 智能代码完成在 Scheme 中是如何工作的?

emacs - 随后运行相同的函数,产生不同的结果

jquery - 每个 div 之间的空白不会消失 [CSS]