110

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

4

6 回答 6

131

C-h mM-x describe-mode显示所有活动的次要模式(和主要模式)以及每种模式的简要说明。

于 2009-10-02T21:02:09.480 回答
24

所有次要模式命令的列表存储在变量中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)))

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

于 2009-10-02T21:17:22.710 回答
5

describe-mode可以以某种方式提出启用的次要模式列表,为什么我不能?因此,在阅读了它的源代码后,我意识到它从minor-mode-list和中获取了活动次要模式的列表minor-mode-alist。使用 3rd-partydash.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 或通过内存启用它们。

于 2014-12-12T16:21:47.990 回答
3

如果您想以编程方式对具有特定模式的所有缓冲区执行某些操作,那么最好、最简约、最干净、内置的解决方案如下:

(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. 通过 检索所有缓冲区的列表,buffer-list当前活动的缓冲区位于列表的头部(因此首先处理它,通常是您想要的,但current-buffer如果您不关心,请忽略该参数)。
  2. 循环遍历缓冲区列表并将每个缓冲区名称分配给变量$buf
  3. 用于with-current-buffer $buf告诉 Emacs 正文中的所有代码都应该像在缓冲区中运行一样运行,$buf而不是在屏幕上真正显示的任何缓冲区。
  4. when <some mode variable>是检查模式是否启用的正确方法;你也可以使用if和其他这样的方法。无论哪种方式,目标都是检查缓冲区中是否设置了次要模式或主要模式的主要模式变量。几乎所有模式都通过“定义”一个模式来定义一个变量,这会自动导致它们创建一个以该模式命名的缓冲区局部变量,这就是它的工作原理。如果他们没有标准变量,请查看他们自己的源代码以了解他们的“切换”代码如何确定如何打开和关闭它们。他们中的 99% 使用了他们的 modename 变量的存在(如果他们不这样做,我建议将其作为错误报告给 mode 的作者)。例如,要检查缓冲区是否激活了空白模式,您会说when whitespace-mode.
  5. 之后,它只是向 Messages 缓冲区输出一条消息,其中带有“x”和激活模式的缓冲区的名称。那是你放置你自己的代码的地方,对发现的缓冲区做任何你想做的事情。

享受!朝着更大更干净的 lisp 代码前进!

于 2016-12-11T21:58:36.680 回答
2

这是一个简单的替代片段,类似于其他答案中已经解决的一些方法:

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
于 2017-01-18T01:16:33.067 回答
0

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

(when (member 'evil-mode minor-mode-list)
   (message "`evil-mode' is active!"))
于 2021-12-03T22:35:37.407 回答