How do you list the active minor modes in emacs?

如何列出 emacs 中的活动次要模式?

31122 次浏览

C-h mM-x describe-mode显示了所有的主动次要模式(和主要模式)和每个简短的描述。

所有次要模式命令的列表存储在变量 minor-mode-list中。通常通过检查同名变量来确定它们是否处于活动状态。所以你可以这样做:

(defun which-active-modes ()
"Give a message of which minor modes are enabled in the current buffer."
(interactive)
(let ((active-modes))
(mapc (lambda (mode) (condition-case nil
(if (and (symbolp mode) (symbol-value mode))
(add-to-list 'active-modes mode))
(error nil) ))
minor-mode-list)
(message "Active modes are %s" active-modes)))

注意: 这只适用于当前缓冲区(因为次要模式可能只在某些缓冲区中启用)。

describe-mode可以以某种方式提供一个启用次要模式的列表,我为什么不能呢?因此,在阅读了它的源代码之后,我意识到它从 minor-mode-listminor-mode-alist获得了活动次要模式的列表。通过使用第三方 dash.el列表操作库,我得到了以下代码:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list)

因此,例如,要禁用所有次要模式,请使用 -each:

(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
(funcall it -1))

不要忘记在变量中保存次要模式列表,否则您将不得不重新启动 Emacs 或通过内存启用它们。

如果你想使用 程序化中的所有缓冲区都有一个特定的活动模式,那么最好的、最简约的、最干净的、内置的解决方案如下:

(dolist ($buf (buffer-list (current-buffer)))
(with-current-buffer $buf
(when some-buffer-local-minor-or-major-mode-variable-you-want-to-find
(message "x %s" $buf))))

它的作用如下:

  1. Retrieve a list of all buffers via buffer-list, with the currently active buffer at the head of the list (so it's treated first, usually what you want, but leave out the current-buffer parameter if you don't care).
  2. 循环访问缓冲区列表并将每个缓冲区名称分配给变量 $buf
  3. 使用 with-current-buffer $buf告诉 Emacs,主体中的所有代码应该像在缓冲区 $buf中运行一样运行,而不是像在屏幕上显示的那样运行。
  4. when <some mode variable>是检查模式是否启用的正确方法; 您还可以使用 if和其他类似的方法。无论哪种方式,目标都是检查在缓冲区中是否设置了次要模式或主要模式的主模式变量。几乎所有的模式都通过“定义”一个模式来定义一个变量,自然而然地使它们创建一个以该模式命名的缓冲区局部变量,这就是它的工作原理。如果他们没有一个标准的变量,查看他们自己的源代码,看看他们的“切换”代码如何决定如何切换它们的开关。99% 的用户使用他们的模式变量(如果他们不使用,我建议将其作为 bug 报告给模式的作者)。例如,要检查缓冲区是否有空格模式的活动,可以使用 when whitespace-mode
  5. 之后,它只是将一条消息输出到 Messages buffer,其中有一个“ x”和激活模式的缓冲区的名称。这是您放置自己的代码的地方,可以对发现的缓冲区执行任何您想要执行的操作。

享受! 继续向更大和更清晰的 lisp 代码!

下面是一个简单的替代代码片段,类似于已经在其他答案中提到的一些方法:

(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))

如果您只想知道某个次要模式(比如 evil-mode)是否在缓冲区中处于活动状态,您可以计算以下内容:

(when (member 'evil-mode minor-mode-list)
(message "`evil-mode' is active!"))