在模式行中隐藏次要模式列表


22

我使用了许多次要模式,通常我知道每种主要模式都启用了哪个次要模式。如果我真的想查看完整列表,可以运行C-h v minor-mode-list

同时,我的模式行确实被阻塞,因此当我垂直拆分帧时,有时我无法读取模式行的末尾。

实际问题:如何禁用模式行中次要模式列表的显示?例如,现在看起来可能像这样:

-:--- main.c        All (7,12)     (C/l FlyC SScr Abbrev Fill) [main] 16:19 0.45

我希望它看起来更简洁:

-:--- main.c        All (7,12)     (C/l) [main] 16:19


2
您也可以查看富裕少数民族模式。
2014年

Answers:


15

缩小模式(在Melpa中可用)将执行此操作。

(diminish 'projectile-mode)

2
如果您只是想缩短次要模式的名称而不是完全隐藏它,则可以使用(diminish 'projectile-mode "p")
erikstokes

5
还请注意,递减的实际用法是(eval-after-load "filladapt" '(diminish 'filladapt-mode))(使用Emacs Wiki中的示例),而不仅仅是(diminish 'filladapt-mode)答案中所建议的。你可以如果模式是保证已被加载使用短版本。
菲尔2014年

15

正如mbork所说,您可以使用delight.el来有选择地修改或禁用模式行中的次要(实际上是主要)模式文本。

优点之一是它可以解决eval-after-load(在大多数情况下,您需要使用diminish.el进行手动编写),从而使配置更整洁。您仍然需要相同的信息-模式的名称以及实现该模式的库(如果询问有关模式的信息,Emacs会告诉您)-但您可以将它们全部包装为一个形式:

 (require 'delight)
 (delight '((some-mode nil "some-library")
            (some-other-mode nil "some-other-library")))

(或点击上面的链接获取一些实际用法示例。)

我建议您采用这种方法,因为即使您不希望大多数次要模式的文本变浅,也很有可能会发现其中的一些有用(并且您仍然可以将它们修改得更短)。

如果您确实想消除所有次要模式的浅色文字(同样,我不推荐这样做),则可以修改该mode-line-modes变量。模式行变量在不久前进行了更改,因此您可能要使用M-x find-variable RET mode-line-modes RET然后手动调整默认定义,并删除有关的部分minor-modes-alist

当然,那么您需要对其进行维护,因为它不是那么快,因此您可能更希望现有值替换该minor-mode-alist符号。以下内容是特定于实现的,但肯定比整体设置更好,您可以打开和关闭它。mode-line-modes

(define-minor-mode minor-mode-blackout-mode
  "Hides minor modes from the mode line."
  t)

(catch 'done
  (mapc (lambda (x)
          (when (and (consp x)
                     (equal (cadr x) '("" minor-mode-alist)))
            (let ((original (copy-sequence x)))
              (setcar x 'minor-mode-blackout-mode)
              (setcdr x (list "" original)))
            (throw 'done t)))
        mode-line-modes))

(global-set-key (kbd "C-c m") 'minor-mode-blackout-mode)

好吧,很可惜没有“喜悦”的包裹。
Mark Karpov 2014年

2
使用Emacs是老package.el是新的东西,有一个的不具有包有用的库。如果您要以这种方式限制自己,我建议您看一下el-get,它将作为各种其他库源类型的管理器(包括更新)。
2014年

1
@Drew,我知道load-pathrequire。一年前开始使用时,我曾经以这种方式“安装”所有Emacs软件包。
Mark Karpov 2014年

3
我刚刚加入delight了MELPA。
sanityinc 2014年

1
delight如今,nb 在GNU ELPA中,而在MELPA中则没有(如果有人对先前的评论感到困惑,请注意)。
phils

8

在配置中使用Rich-minority

(require 'rich-minority)
(rich-minority-mode 1)
(setf rm-blacklist "")

我也有和您一样的想法,但是我将模式行缩短了偏执狂

  • 删除所有不需要的空间
  • 删除缓冲区位置信息字段的所有空格和“最小宽度”。
;; Remove all unwanted spaces
(setq-default mode-line-format
          '("%e" mode-line-front-space mode-line-mule-info mode-line-client mode-line-modified mode-line-remote mode-line-buffer-identification mode-line-position
        (vc-mode vc-mode) " "
        mode-line-modes mode-line-misc-info mode-line-end-spaces))
;; Remove all spaces and "min-width" of position info on mode-line
(setq mode-line-position
      `((1 ,(propertize
         " %p"
         'local-map mode-line-column-line-number-mode-map
         'mouse-face 'mode-line-highlight
         ;; XXX needs better description
         'help-echo "Size indication mode\n\
mouse-1: Display Line and Column Mode Menu"))
    (size-indication-mode
     (2 ,(propertize
          "/%I"
          'local-map mode-line-column-line-number-mode-map
          'mouse-face 'mode-line-highlight
          ;; XXX needs better description
          'help-echo "Size indication mode\n\
mouse-1: Display Line and Column Mode Menu")))
    (line-number-mode
     ((column-number-mode
       (1 ,(propertize
        "(%l,%c)"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Line number and Column number\n\
mouse-1: Display Line and Column Mode Menu"))
       (1 ,(propertize
        "L%l"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Line Number\n\
mouse-1: Display Line and Column Mode Menu"))))
     ((column-number-mode
       (1 ,(propertize
        "C%c"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Column number\n\
mouse-1: Display Line and Column Mode Menu"))))))
      )

现在,我总是可以看到Twittering模式通知和Org模式的计时器:D


5

这对我有用:

(defvar hidden-minor-modes ; example, write your own list of hidden
  '(abbrev-mode            ; minor modes
    auto-fill-function
    flycheck-mode
    flyspell-mode
    inf-haskell-mode
    haskell-indent-mode
    haskell-doc-mode
    smooth-scroll-mode))

(defun purge-minor-modes ()
  (interactive)
  (dolist (x hidden-minor-modes nil)
    (let ((trg (cdr (assoc x minor-mode-alist))))
      (when trg
        (setcar trg "")))))

(add-hook 'after-change-major-mode-hook 'purge-minor-modes)

感谢Drew的评论,我改进了此解决方案的实现。现在,它利用了关联列表的好处,应该会更有效率;-)


FWIW,它将不会捕获手动启用的先前卸载的次要模式,也不会动态更新其较浅文本的模式(也不是其他库也这样做)。但是否则,这似乎是一种合理的实用方法。
2014年

1
minor-mode-alist作为一个ALIST是条目可以添加和删除在头阴影和unshadow条目进一步下跌有相同的密钥列表。如果您想做自己想做的事情,只需为每个键更改第一个条目(使用找到,使用assoc更改setcar等),这样就不会丢失此有用的预期功能。
Drew

@Drew,您是对的,请参阅我改进的解决方案。
Mark Karpov 2014年

对; 我正是这个意思。
Drew

3

我也将解决方案放入环中:

(defun modeline-set-lighter (minor-mode lighter)
  (when (assq minor-mode minor-mode-alist)
    (setcar (cdr (assq minor-mode minor-mode-alist)) lighter)))

(defun modeline-remove-lighter (minor-mode)
  (modeline-set-lighter minor-mode ""))

modeline-set-lighter允许您将次要模式的打火机设置为您喜欢的任何字符串。modeline-remove-lighter可让您完全删除次要模式的打火机。

然后,在我的init文件的末尾,我只是为需要修改打火机的次要模式调用这些函数:

(modeline-remove-lighter 'auto-complete-mode)
(modeline-remove-lighter 'git-gutter+-mode)
(modeline-remove-lighter 'guide-key-mode)
(modeline-remove-lighter 'whitespace-mode)
(modeline-set-lighter 'abbrev-mode " Abbr")
(modeline-set-lighter 'auto-fill-function (string 32 #x23ce))

2

您还可以通过以下方式直截了当地删除所有次要模式:

(setq mode-line-modes
      (mapcar (lambda (elem)
                (pcase elem
                  (`(:propertize (,_ minor-mode-alist . ,_) . ,_)
                   "")
                  (t elem)))
              mode-line-modes))

这也将努力在未来定义的次要模式,因为它只是完全取消的minor-mode-alistmode-line-format


1

值得一提的是,use-package 支持减少和愉悦。如果使用它来管理软件包,则可以在模式行中隐藏次要模式,并添加:diminish或:delight关键字。

(use-package abbrev
  :diminish abbrev-mode
  :config
  (if (file-exists-p abbrev-file-name)
     (quietly-read-abbrev-file)))

0

我看不出要安装像这样的简单名称扩展的意义:

(setcar (alist-get minor-mode minor-mode-alist) "")

例如:

(dolist (mode '(projectile-mode
                whitespace-mode
                hs-minor-mode
                outline-minor-mode
                auto-fill-function))
  (setcar (alist-get mode minor-mode-alist) ""))

您可以通过这种方式做任何事情。从上面显而易见,替换文本。另外,例如,将flymake模式置于列表的开头:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.