Emacs 检查主模式是否等于多个EMAC中的一个

Emacs 检查主模式是否等于多个EMAC中的一个,emacs,elisp,Emacs,Elisp,我找到了一个关闭所有dired缓冲区的代码片段,我想在sunrise commander中使用它: (defun er/kill-all-dired-buffers() "Kill all dired buffers." (interactive) (save-excursion (let((count 0)) (dolist(buffer (buffer-list)) (set-buffer buf

我找到了一个关闭所有dired缓冲区的代码片段,我想在sunrise commander中使用它:

(defun er/kill-all-dired-buffers()
      "Kill all dired buffers."
      (interactive)
      (save-excursion
        (let((count 0))
          (dolist(buffer (buffer-list))
            (set-buffer buffer)
            (when (equal major-mode 'sr-mode) 
              (or (equal major-mode 'dired-mode))
              (setq count (1+ count))
              (kill-buffer buffer)))
          (message "Killed %i dired buffer(s)." count ))))
(setq sr-quit-hook 'er/kill-all-dired-buffers)
问题是,我不能使它同时适用于sr模式和dired模式。 如何检查“主模式是sr模式还是dired模式”


编辑: 只是语法错误。 应该是

(when (or (equal major-mode 'dired-mode) (equal major-mode 'sr-mode))

必须承认这不是很直观。

标准方法是
(当(派生模式-p'sr mode'dired mode)…)

我尝试了一些方法,发现这对我的emacs ielm有效-也许它也有帮助:

(if (member major-mode '(fsharp-mode c-mode java-mode inferior-emacs-lisp-mode))
(message "yeah right"))

正确的检查功能可能是:

(derived-mode-p &rest MODES)

请参阅“subr.el”。

是的,这就是我所缺少的。它非常直观。您的原始代码类似于用C编写
if(foo){| | | bar;baz()}
。不相信。如果(foo | | bar){baz()}是直观的。前缀运算符在一种始终使用前缀运算符的语言中是完全直观的:)Stefan提供了最好的解决方案,但也要注意,如果您对任何潜在的派生模式都不感兴趣,那么您可以使用
(当(memq主模式)(sr-mode-dired模式))…)
您复制了公认的答案(大约5年后)。我建议删除这个。