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

时间:2009-10-02 20:52:21

标签: emacs minor-mode

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

5 个答案:

答案 0 :(得分:112)

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

答案 1 :(得分:20)

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

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

答案 2 :(得分:3)

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或通过内存启用它们。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

(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检索所有缓冲区的列表,当前活动的缓冲区位于列表的开头(因此它首先被处理,通常是你想要的,但忽略{{1}参数,如果你不在乎)。
  2. 循环缓冲区列表并将每个缓冲区名称分配给变量current-buffer
  3. 使用$buf告诉Emacs正文中的所有代码都应该像在缓冲区with-current-buffer $buf内运行一样运行,而不是在屏幕上真正显示的任何缓冲区。
  4. $buf是检查模式是否已启用的正确方法;您还可以使用when <some mode variable>和其他此类方法。无论哪种方式,目标是检查缓冲区中是否设置了辅助模式或主模式的主模式变量。几乎所有模式都通过&#34;定义&#34;来定义变量。一个模式,自动使它们创建一个以模式命名的缓冲区局部变量,这就是它的工作原理。如果他们没有标准变量,请查看他们自己的源代码,看看他们如何切换&#34;切换&#34;代码确定如何打开和关闭它们。其中99%的人使用了modename变量的存在(如果他们不知道,我建议将此作为模式作者的错误报告)。例如,要检查缓冲区是否具有空白模式活动,您可以说if
  5. 之后,它只是向消息缓冲区输出一条消息,其中包含&#34; x&#34;以及模式处于活动状态的缓冲区的名称。这就是你自己编写代码的地方,用你想对发现的缓冲区做任何事情。
  6. 享受!转向更大更清洁的lisp代码!