首页 文章

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

提问于
浏览
93

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

5 回答

  • 105

    C-h mM-x describe-mode 显示所有活动的次要模式(和主要模式)以及每种模式的简要说明 .

  • 2

    所有次要模式命令的列表存储在变量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)))
    

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

  • 3

    describe-mode 可以以某种方式提出一个启用的小模式列表,为什么我不能?因此,在阅读其源代码后,我意识到它从 minor-mode-listminor-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或通过内存启用它们 .

  • 19

    这是一个简单的替代代码片段,类似于其他答案中已经解决过的一些方法:

    (delq nil
      (mapcar
        (lambda (x)
          (let ((car-x (car x)))
            (when (and (symbolp car-x) (symbol-value car-x))
              x)))
        minor-mode-alist))
    
  • 1

    如果您想以编程方式对所有具有某种模式活动的缓冲区执行某些操作,那么最佳,最简约,最干净的内置解决方案如下所示:

    (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 等方法 . 无论哪种方式,目标是检查缓冲区中是否设置了辅助模式或主模式的主模式变量 . 几乎所有模式都通过"defining"模式定义一个变量,它自动使它们创建一个以模式命名的缓冲区局部变量,这就是它的工作原理 . 如果他们没有变量(如果他们不是作者的话) . 例如,要检查缓冲区是否具有空白模式活动,您可以说 when whitespace-mode .

    • 之后,它只是向Messages缓冲区输出一条消息,其中包含"x"和模式处于活动状态的缓冲区的名称 . 那个's where you' d放了你自己的代码,做你想做的任何发现的缓冲区 .

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

相关问题