代码之家  ›  专栏  ›  技术社区  ›  Joe Holloway

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

  •  94
  • Joe Holloway  · 技术社区  · 17 年前

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

    5 回复  |  直到 9 年前
        1
  •  108
  •   Phil    17 年前

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

        2
  •  19
  •   sw1nn    13 年前

    所有次要模式命令的列表存储在变量中 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
  •  3
  •   Mirzhan Irkegulov    11 年前

    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或通过内存启用它们。

        4
  •  2
  •   lawlist    9 年前

    下面是一个简单的替代代码片段,类似于其他答案中已经提到的一些方法:

    (delq nil
      (mapcar
        (lambda (x)
          (let ((car-x (car x)))
            (when (and (symbolp car-x) (symbol-value car-x))
              x)))
        minor-mode-alist))
    
        5
  •  1
  •   gw0 ROunofF    9 年前

    如果你想 以编程方式 对所有具有特定模式活动的缓冲区执行某些操作,然后最佳、最简单、最干净的内置解决方案如下:

    (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 ,当前活动的缓冲区位于列表的最前面(因此,它首先被处理,通常是您想要的,但不包括 current-buffer 参数)。
    2. 循环访问缓冲区列表并将每个缓冲区名称赋给变量 $buf .
    3. 使用 with-current-buffer $buf 告诉Emacs主体中的所有代码都应该像在缓冲区中运行一样运行 $BUF 而不是你真正在屏幕上显示的缓冲区。
    4. when <some mode variable> 是检查模式是否已启用的正确方法;您也可以使用 if 以及其他类似的方法。无论哪种方法,目标都是检查是否在缓冲区中设置了次要模式或主要模式的主模式变量。几乎所有的模式都是通过“定义”一个模式来定义一个变量, 自动地 使它们创建一个以模式命名的缓冲区局部变量,这就是它的工作方式。如果他们没有一个标准变量,看看他们自己的源代码,看看他们的“切换”代码如何决定如何打开和关闭它们。99%的用户使用modename变量的存在(如果不存在,我建议将其作为bug报告给模式的作者)。例如,要检查缓冲区是否有激活的空白模式,可以说 when whitespace-mode .
    5. 之后,它只向消息缓冲区输出一条消息,其中有一个“x”和激活模式的缓冲区的名称。在这里,您可以放置自己的代码,对发现的缓冲区做任何您想做的事情。

    享受!向更大更干净的lisp代码前进!