在某些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)))

我的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 '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!),也不知道它接受多个模式。相应地调整了答案。