Answers:
所有次要模式命令的列表都存储在变量中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)))
注意:这仅适用于当前缓冲区(因为次要模式可能仅在某些缓冲区中启用)。
boundp
代替symbolp
您可以摆脱condition-case
。
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或通过内存启用它们。
如果要以编程方式对所有处于某个特定模式的缓冲区进行激活,则最佳,最简约,最简洁的内置解决方案如下:
(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
,将当前活动的缓冲区放在列表的顶部(因此,通常会首先处理所需的缓冲区,current-buffer
如果您不在意,则忽略该参数)。$buf
。with-current-buffer $buf
告诉Emacs的身体内的所有代码应运行,如果它是运行缓冲区内$buf
,而不是任何缓冲你真的在屏幕上显示。when <some mode variable>
是检查模式是否启用的正确方法;您也可以使用if
和其他此类方法。无论哪种方式,目标都是检查缓冲区中是否设置了次要或主要模式的主模式变量。几乎所有模式都通过“定义”模式来定义变量,这将自动使它们创建以该模式命名的局部缓冲区变量,这就是这种方式。如果他们没有标准变量,请查看他们自己的源代码,以了解他们的“切换”代码如何确定如何打开和关闭它们。他们中的99%使用其模式名变量的存在(如果不存在,我建议将其报告为模式作者的错误)。例如,要检查缓冲区是否激活了空白模式,您可以说when whitespace-mode
。请享用!继续使用更大,更干净的Lisp代码!