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

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

Ch mMx 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-listminor-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)))) 

它执行以下操作:

  1. 通过buffer-list检索所有缓冲区buffer-list ,当前活动的缓冲区在列表的头部(所以它首先被处理,通常是你想要的,但是如果你不在意的话,省略掉current-buffer参数)。
  2. 循环访问缓冲区列表,并将每个缓冲区名称分配给variables$buf
  3. 使用with-current-buffer $buf来告诉Emacs,正文中的所有代码应该像在缓冲区$buf运行一样运行,而不是在屏幕上显示的任何缓冲区。
  4. when <some mode variable>是检查模式是否启用的正确方法; 你也可以使用if和其他这样的方法。 无论哪种方式,目标是检查是否在缓冲区中设置了主或主模式的主模式variables。 几乎所有的模式都是通过“定义”一个模式来定义一个variables,这个模式会自动使它们创build一个以该模式命名的缓冲区局部variables,这就是工作原理。 如果他们没有一个标准的variables,看看他们自己的源代码,看看他们的“切换”代码如何决定如何切换他们打开和closures。 其中99%的人使用他们的modenamevariables(如果他们不这样做,我build议把这个报告作为模式作者的一个bug)。 例如,要检查一个缓冲区是否有空白模式激活,你应该说when whitespace-mode
  5. 之后,它只是向消息缓冲区输出一个消息,并带有一个“x”和激活模式的缓冲区的名称。 这就是你放置你自己的代码的地方,你可以做任何你想做的事情与发现的缓冲区。

请享用! 向更大,更清洁的lisp代码!

Interesting Posts