如何列出emacs中的活动次要模式?
答案 0 :(得分:112)
C-h m
或M-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-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 :(得分: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))))
它执行以下操作:
buffer-list
检索所有缓冲区的列表,当前活动的缓冲区位于列表的开头(因此它首先被处理,通常是你想要的,但忽略{{1}参数,如果你不在乎)。current-buffer
。$buf
告诉Emacs正文中的所有代码都应该像在缓冲区with-current-buffer $buf
内运行一样运行,而不是在屏幕上真正显示的任何缓冲区。$buf
是检查模式是否已启用的正确方法;您还可以使用when <some mode variable>
和其他此类方法。无论哪种方式,目标是检查缓冲区中是否设置了辅助模式或主模式的主模式变量。几乎所有模式都通过&#34;定义&#34;来定义变量。一个模式,自动使它们创建一个以模式命名的缓冲区局部变量,这就是它的工作原理。如果他们没有标准变量,请查看他们自己的源代码,看看他们如何切换&#34;切换&#34;代码确定如何打开和关闭它们。其中99%的人使用了modename变量的存在(如果他们不知道,我建议将此作为模式作者的错误报告)。例如,要检查缓冲区是否具有空白模式活动,您可以说if
。享受!转向更大更清洁的lisp代码!