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


Answers:


125

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


21

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

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


在地图内添加到列表?令人费解。
jrockway

4
@jrockway不是我最骄傲的一口气。
Trey Jackson

使用boundp代替symbolp您可以摆脱condition-case
拉西

4

describe-mode能以某种方式列出已启用的次要模式列表,为什么不呢?因此,在阅读了源代码之后,我意识到它从minor-mode-list和中都获取了活动次要模式的列表minor-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

如果要以编程方式对所有处于某个特定模式的缓冲区进行激活,则最佳,最简约,最简洁的内置解决方案如下:

(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%使用其模式名变量的存在(如果不存在,我建议将其报告为模式作者的错误)。例如,要检查缓冲区是否激活了空白模式,您可以说when whitespace-mode
  5. 此后,它仅将一条消息输出到“消息”缓冲区,带有“ x”和具有活动模式的缓冲区的名称。那是您放置自己的代码的地方,可以对发现的缓冲区进行任何处理。

请享用!继续使用更大,更干净的Lisp代码!


2

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

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.