在某些Emacs模式下停止运行挂钩
我的GNU Emacs配置中有这一行,它在保存时会清除空白:在某些Emacs模式下停止运行挂钩,emacs,elisp,gnu,Emacs,Elisp,Gnu,我的GNU Emacs配置中有这一行,它在保存时会清除空白: (add-hook 'before-save-hook 'whitespace-cleanup) 如何防止它在某些模式下运行(例如,Makefile模式)?以下定义将在除条件中给出的模式外的其他模式下运行空白清理: (defun elektito/whitespace-cleanup () (when (not (derived-mode-p 'makefile-mode)) (whitespace-cleanup)))
(add-hook 'before-save-hook 'whitespace-cleanup)
如何防止它在某些模式下运行(例如,Makefile模式)?以下定义将在除条件中给出的模式外的其他模式下运行
空白清理
:
(defun elektito/whitespace-cleanup ()
(when (not (derived-mode-p 'makefile-mode))
(whitespace-cleanup)))
(add-hook 'before-save-hook 'elektito/whitespace-cleanup)
这使用derived-mode-p
来检查当前模式,而不是像您提到的makefiles那样直接比较,并且makefiles使用大量稍微不同的模式,所有这些模式都是从makefile模式
派生的derived-mode-p
接受多个参数以检查不同的父模式
(注意:可以使用
(除非是COND EXPR)
而不是(当(不是COND)EXPR)
时,但我发现可读性较差;您可能有不同的首选项。)出于兴趣,您为什么试图停止在这些模式下运行空白清理
,而不是让它在那些模式下工作?如果你知道这样做的方法,我将非常感激知道。目前我所知道的是,空白清理会通过删除所有制表符来打乱我的makefile。是删除制表符,还是(用空格)替换制表符?在任何情况下,我都无法复制这个问题,但删除它似乎非常奇怪。在一个Makefile缓冲区中,缩进制表符模式
、制表符宽度
和空白样式
变量的值是什么?(使用该缓冲区中的C-hv
)。另外,看看您是否愿意只修改实际编辑行上的空格。是的,您做了一些非常奇怪的事情,因为makefile模式
出于明显的原因执行显式(setq缩进制表符模式t)
。配置中的某些内容正在覆盖它。找到并修复它。(注意,缩进制表符模式
是自动缓冲本地模式,因此它与您的默认值无关)。我只选择(派生模式-p'makefile mode'some major mode'other major mode)
,这样即使是从某个主模式
继承的模式也能工作。谢谢你,Lindydancer。我没有意识到derived-mode-p
也会检查模式是否相等(当然,doh!),也不知道它接受多个模式。相应地调整了答案。