题
你怎么列的活性微小的模式在emacs?
解决方案
C-h m
或M-x describe-mode
显示了所有的活性次要模式(和主要模式),并且每个的一个简要说明。
其他提示
一个列表中的所有小的模式的命令是存在的可变 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)))
注:这仅适用于当前的缓冲器(因为轻微的模式,可能只有启用了某些缓冲区).
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或内存启用它们。
下面是类似的一些已经被在其他的答案解决的方法的简单替代片段:
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))
如果你想要 编程方式 做了些什么所有的缓冲区,有一定的模式的活动,那么最好,最简单、最清洁、建立解决方案如下:
(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%的人使用了存在的其modename的变量(如果他们不这样做,我建议报告说,作为一个错误的模式是作者).例如,检查,如果一个缓冲区有空白模式活动的,你会说when whitespace-mode
.- 在这之后,它就输出的信息的消息缓冲区,与一个"x"和名称的缓冲区有模式的活动。这就是你会把你自己的代码,做任何你想要做的发缓冲器。
享受!起更大的和更清洁的舌头的代码!
不隶属于 StackOverflow