你如何在emacs中列出活动的次要模式?
你如何在emacs中列出活动的次要模式?
Ch m
或Mx describe-mode
显示所有活动次要模式(和主要模式)以及每个模式的简要说明。
所有次要模式命令的列表都存储在variablesminor-mode-list
。 通过检查相同名称的variables来查找它们是否处于活动状态。 所以你可以做这样的事情:
(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)))
注意:这只适用于当前缓冲区(因为次要模式可能只在某些缓冲区中被启用)。
describe-mode
可以以某种方式想出一个启用次要模式的列表,为什么我不能? 所以在阅读了它的源代码后,我意识到它从minor-mode-list
和minor-mode-alist
获得了活动次要模式minor-mode-list
。 使用第三方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))
不要忘记将次要模式列表保存在一个variables中,否则您将不得不重新启动Emacs或通过内存启用它们。
这是一个简单的替代片段,类似于其他答案中已经提到的一些方法:
(delq nil (mapcar (lambda (x) (let ((car-x (car x))) (when (and (symbolp car-x) (symbol-value car-x)) x))) minor-mode-alist))
如果您想以编程方式对所有具有特定模式的缓冲区执行某些操作,那么最佳,最简约,最干净的内置解决scheme如下所示:
(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
检索所有缓冲区buffer-list
,当前活动的缓冲区在列表的头部(所以它首先被处理,通常是你想要的,但是如果你不在意的话,省略掉current-buffer
参数)。 - 循环访问缓冲区列表,并将每个缓冲区名称分配给variables
$buf
。 - 使用
with-current-buffer $buf
来告诉Emacs,正文中的所有代码应该像在缓冲区$buf
运行一样运行,而不是在屏幕上显示的任何缓冲区。 -
when <some mode variable>
是检查模式是否启用的正确方法; 你也可以使用if
和其他这样的方法。 无论哪种方式,目标是检查是否在缓冲区中设置了主或主模式的主模式variables。 几乎所有的模式都是通过“定义”一个模式来定义一个variables,这个模式会自动使它们创build一个以该模式命名的缓冲区局部variables,这就是工作原理。 如果他们没有一个标准的variables,看看他们自己的源代码,看看他们的“切换”代码如何决定如何切换他们打开和closures。 其中99%的人使用他们的modenamevariables(如果他们不这样做,我build议把这个报告作为模式作者的一个bug)。 例如,要检查一个缓冲区是否有空白模式激活,你应该说when whitespace-mode
。 - 之后,它只是向消息缓冲区输出一个消息,并带有一个“x”和激活模式的缓冲区的名称。 这就是你放置你自己的代码的地方,你可以做任何你想做的事情与发现的缓冲区。
请享用! 向更大,更清洁的lisp代码!