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

如何在emacs中列出激活的次要模式?,emacs,minor-mode,Emacs,Minor Mode,如何在emacs中列出激活的次要模式?C-h m或m-x描述模式显示所有激活的次要模式(和主要模式)以及每个模式的简要说明。所有次要模式命令的列表存储在变量中。通常通过检查同名变量来确定它们是否处于活动状态。所以你可以这样做: (defun which-active-modes () "Give a message of which minor modes are enabled in the current buffer." (interactive) (let ((active-

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

C-h m
m-x描述模式
显示所有激活的次要模式(和主要模式)以及每个模式的简要说明。

所有次要模式命令的列表存储在变量中。通常通过检查同名变量来确定它们是否处于活动状态。所以你可以这样做:

(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)))

注意:这仅适用于当前缓冲区(因为次要模式可能仅在某些缓冲区中启用)。

descripe mode
可以以某种方式列出已启用的次要模式,为什么我不能?因此,在阅读了它的源代码后,我意识到它从
次要模式列表
次要模式列表
中获取了活动次要模式列表。使用第三方列表操纵库,我附带了以下代码:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list)
因此,例如,要禁用所有次要模式,请使用:

不要忘记将次要模式列表保存在变量中,否则您将不得不重新启动Emacs或通过内存启用它们。

如果您希望以编程方式对所有具有特定活动模式的缓冲区执行某些操作,那么最好、最简单、最干净的内置解决方案如下所示:

(数据列表($buf(缓冲区列表(当前缓冲区)))
(当前缓冲区为$buf)
(当需要查找某个缓冲区局部次要或主要模式变量时
(消息“x%s”$buf)))
它做了以下工作:

  • 通过
    缓冲区列表
    检索所有缓冲区的列表,当前活动的缓冲区位于列表的开头(因此首先处理它,通常是您想要的,但如果您不介意,请忽略
    当前缓冲区
    参数)
  • 循环浏览缓冲区列表,并将每个缓冲区名称分配给变量
    $buf
  • 对当前缓冲区$buf使用
    ,告诉Emacs主体中的所有代码都应该像在缓冲区
    $buf
    中运行一样运行,而不是在屏幕上真正显示的任何缓冲区
  • 是检查模式是否启用的正确方法时;您还可以使用
    if
    和其他类似方法。无论哪种方式,目标都是检查缓冲区中是否设置了次要模式或主要模式的主模式变量。几乎所有模式都通过“定义”模式来定义变量,这会自动导致它们创建一个以模式命名的缓冲区局部变量,这就是其工作原理。如果他们没有标准变量,请查看他们自己的源代码,看看他们的“切换”代码如何决定如何打开和关闭它们。99%的用户使用modename变量的存在(如果不使用,我建议将其作为bug报告给mode的作者)。例如,要检查缓冲区是否有空白模式处于活动状态,可以在空白模式下说
  • 之后,它只向消息缓冲区输出一条消息,带有一个“x”和激活模式的缓冲区的名称。这就是您放置自己的代码的地方,可以对发现的缓冲区执行任何您想执行的操作

  • 享受吧!继续使用更大更干净的lisp代码

    这里有一个简单的替代片段,类似于其他答案中已经提到的一些方法:

    (delq nil
    (地图车
    (λ(x)
    (让((car-x(car-x)))
    (当(和(符号car-x)(符号值car-x))
    x) ))
    小调模式
    
    是否添加到地图内的列表?错综复杂。@jrockway不是我最自豪的lisp时刻。使用
    boundp
    而不是
    symbolp
    可以摆脱
    情况。
    
    (--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
            (funcall it -1))