Сховати список другорядних режимів у рядку режиму


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

Зменшення режиму (доступний у Мельпі) це зробить.

(diminish 'projectile-mode)

2
Якщо ви просто хочете скоротити ім'я другорядного режиму, а не ховати його цілком, можете скористатися(diminish 'projectile-mode "p")
erikstokes

5
Зауважимо також, що фактичне використання зменшується (eval-after-load "filladapt" '(diminish 'filladapt-mode))(використовуючи приклад з Emacs Wiki), а не так, (diminish 'filladapt-mode)як пропонується у відповіді. Використовувати коротку версію можна лише тоді, коли режим гарантовано завантажений.
phils

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)

Ну, сумно, що пакету "захоплення" немає.
Марк Карпов

2
Що, коли Emacs є старим, а package.el є новим, існує купа корисних бібліотек, які не мають пакунків. Якщо ви збираєтесь обмежити себе таким чином, я б запропонував подивитися на el-get, який буде виконувати функції менеджера (оновлення включене) для великої кількості інших типів джерел бібліотеки.
phils

1
@Drew, я знаю про load-pathі require. Я колись «встановлював» всі пакунки Emacs, коли почав користуватися ним рік тому.
Марк Карпов

3
Я щойно додав delightдо MELPA.
sanityinc

1
nb delightзнаходиться в GNU ELPA в наші дні, а не в MELPA (згадується у випадку, якщо хтось заплутається у попередніх коментарях).
філс

8

Використовуйте меншості з конфігурацією:

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

Завдяки коментарю Дрю , я покращив реалізацію цього рішення. Тепер він використовує переваги списків асоціацій і повинен бути трохи ефективнішим ;-)


FWIW, він не буде вловлювати раніше завантажені незначні режими, які ввімкнено вручну, ні режими, що динамічно оновлюють їх легший текст (не те, що інші бібліотеки роблять останні). Але в іншому випадку це здається досить практичним підходом.
phils

1
Сенс minor-mode-alistбути алістом полягає в тому, що записи можна додавати та видаляти вгорі, щоб тіні та відтінки записувались далі за списком, який має той самий ключ. Якщо ви хочете робити те, що ви робите, просто змініть перший запис (знайдений за допомогою 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дозволяє повністю прибрати запальничку другорядного режиму.

Потім в кінці свого 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-alistз mode-line-format.


1

Варто зазначити, що use-package підтримує зменшення та захоплення . Якщо ви використовуєте його для управління вашими пакунками, ви можете приховати незначні режими в рядку режиму, додавши ключові слова: зменшити або: насолоджуватися.

(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))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.