Скрыть список второстепенных режимов в строке состояния

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
Вы также можете заглянуть в режим богатого меньшинства .
Каушал Моди

Ответы:

15

Режим уменьшения (доступный в Melpa) сделает это.

(diminish 'projectile-mode)
Колин Белл
источник
2
Если вы просто хотите сократить название второстепенного режима вместо того, чтобы полностью его скрыть, вы можете использовать(diminish 'projectile-mode "p")
erikstokes
5
Также обратите внимание, что фактическое использование diminish - это (eval-after-load "filladapt" '(diminish 'filladapt-mode))(используя пример из Emacs Wiki), а не только (diminish 'filladapt-mode)как предложено в ответе. Вы можете использовать только короткую версию, если режим гарантированно уже загружен.
Филс
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)
Phils
источник
Что ж, это грустно, что нет пакета «восторга».
Марк Карпов
2
Что касается устаревшего Emacs и нового package.el, есть куча полезных библиотек, в которых нет пакетов. Если вы собираетесь ограничить себя таким образом, я бы посоветовал взглянуть на el-get, который будет выступать в роли менеджера (включая обновление) для большого разнообразия других типов библиотечных источников.
Филс
1
@ Дрю, я знаю про load-pathи require. Я имел обыкновение «устанавливать» все пакеты Emacs таким образом, когда я начал использовать его год назад.
Марк Карпов
3
Я только что добавил delightв MELPA.
sanityinc
1
nb в настоящее время delightнаходится в GNU ELPA, а не в MELPA (упомянуто на случай, если кто-то запутается в предыдущих комментариях).
Филс
8

Используйте Rich-minority с config:

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

У меня тоже есть такая же мысль, как и у вас, но я сокращаю модельную линию более параноидально :

  • Удалить все ненужные места
  • Удалите все пробелы и "min-width" из поля информации о положении буфера.
;; 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"))))))
      )

Теперь я всегда вижу уведомления в режиме Твиттера и таймер в режиме Org: D

kuanyui
источник
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)

Благодаря комментарию Дрю , я улучшил реализацию этого решения. Теперь он использует преимущества списков ассоциаций и должен быть немного более эффективным ;-)

Марк Карпов
источник
FWIW, он не будет ловить ранее выгруженные второстепенные режимы, которые включены вручную, и режимы, которые динамически обновляют свой более светлый текст (не то, что другие библиотеки также делают последнее). Но в остальном это кажется достаточно практичным подходом.
Фил
1
Смысл minor-mode-alistбудучи креном в том , что можно добавлять и удалять записи в голову тени и unshadow записи далее вниз по списку , которые имеют один и тот же ключ. Если вы хотите делать то, что делаете, просто измените первую запись (найденную с помощью assoc, измененную с помощью setcarи т. Д.) Для каждой клавиши, чтобы не потерять эту полезную, намеченную функцию.
Дрю
@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позволяет полностью убрать зажигалку из второстепенного режима.

Затем в конце моего файла инициализации я просто вызываю эти функции для второстепенных режимов, зажигалки которых я хочу изменить:

(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))
itsjeyd
источник
2

Вы также можете прямо удалить все второстепенные режимы следующим образом:

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

Это также будет работать для второстепенных режимов, определенных в будущем, поскольку оно просто полностью исключает использование minor-mode-alistиз mode-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)))
Marcos
источник
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))))
memeplex
источник