Emacs:仅为init.el中的给定主模式加载包

Emacs:仅为init.el中的给定主模式加载包,emacs,elisp,Emacs,Elisp,不久前,我为一些使用特定格式的文件创建了一个.el文件(epx.el)。我通过(需要'epx)在init.el中加载它 问题在于,在这个epx.el中,有: (defadvice comment-region (after indent-after activate) (indent-region beg end) ) (defadvice uncomment-region (after indent-after activate) (indent-region beg end)

不久前,我为一些使用特定格式的文件创建了一个.el文件(epx.el)。我通过
(需要'epx)
在init.el中加载它

问题在于,在这个epx.el中,有:

(defadvice comment-region (after indent-after activate)
  (indent-region beg end)
  )
(defadvice uncomment-region (after indent-after activate)
  (indent-region beg end)
  )
我遇到了麻烦,因为它会影响其他主要模式下注释函数(例如
comment dwim
)的行为(特别是在python模式下:当我取消注释注释区域时,它会破坏缩进…)。如果我在epx.el中对这些行进行注释,就不会再有问题了

那么,这些
(defadvice…
如何仅在epx主模式下有效


谢谢

您可以检查当前缓冲区的主模式,并且仅当它是
exp模式时才采取操作:

(defadvice comment-region (after indent-after activate)
  (if (derived-mode-p 'exp-mode)
      (indent-region beg end))
  )
(defadvice uncomment-region (after indent-after activate)
  (if (derived-mode-p 'exp-mode)
      (indent-region beg end))
  )

编辑:按照@Stefan的建议使用
derived-mode-p

(buffer local value'主模式(当前缓冲区))
是编写
主模式的一种迂回方式。通常为了测试主模式,我推荐
derived-mode-p
。谢谢,我修改了答案以使用您的建议。