Ukryj listę mniejszych trybów w linii trybu

22

Korzystam z kilku mniejszych trybów i zwykle wiem, który z mniejszych trybów jest włączony w każdym większym trybie. Jeśli naprawdę chcę zobaczyć pełną listę, mogę uruchomić C-h v minor-mode-list.

Jednocześnie moja linia trybu jest naprawdę zatkana, więc kiedy pionowo dzielę ramkę, czasami nie mogę odczytać końca linii trybu.

Rzeczywiste pytanie: jak wyłączyć wyświetlanie listy mniejszych trybów w linii trybu? Na przykład teraz może to wyglądać tak:

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

Chcę, żeby wyglądało to bardziej zwięźle:

-:--- main.c        All (7,12)     (C/l) [main] 16:19
Mark Karpov
źródło
2
Możesz także zajrzeć do trybu bogatej mniejszości .
Kaushal Modi

Odpowiedzi:

15

Zrobi to tryb zmniejszania (dostępny w Melpie).

(diminish 'projectile-mode)
Colin Bell
źródło
2
Jeśli chcesz tylko skrócić nazwę mniejszego trybu zamiast całkowicie go ukrywać, możesz użyć(diminish 'projectile-mode "p")
erikstokes
5
Zauważ też, że faktyczne użycie diminish jest (eval-after-load "filladapt" '(diminish 'filladapt-mode))(na przykładzie z Emacs Wiki), a nie tylko (diminish 'filladapt-mode)tak, jak sugeruje odpowiedź. Z krótkiej wersji można korzystać tylko wtedy, gdy tryb jest już załadowany.
phils
15

Jak skomentował mbork, możesz użyć delight.el, aby selektywnie modyfikować lub wyłączać mniejszy (i rzeczywiście większy) tekst w trybie linii.

Jedną z zalet jest to, że dba o to eval-after-load(co musisz napisać ręcznie przy pomocy diminish.el w większości przypadków użycia), co czyni konfigurację czystszą. Nadal potrzebujesz tych samych informacji - nazwy trybu i biblioteki, która go implementuje (co Emacs powie ci, jeśli zapytasz go o tryb) - ale możesz to wszystko zawrzeć w jednym formularzu:

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

(Lub skorzystaj z powyższego linku, aby uzyskać przykłady prawdziwych zastosowań).

Poleciłbym takie podejście, ponieważ nawet jeśli nie chcesz, aby większość lżejszych tekstów w trybie mniejszym, istnieje duża szansa, że ​​niektóre z nich okażą się przydatne (i nadal możesz zmodyfikować te, aby były krótsze).

Jeśli naprawdę chcesz wyeliminować cały jaśniejszy tekst w trybie pomocniczym (i ponownie, nie polecam go), możesz zmodyfikować mode-line-modeszmienną. Zmienne linii trybu zmieniły się jakiś czas temu, więc możesz chcieć użyć, M-x find-variable RET mode-line-modes RETa następnie ręcznie dostosować swoją domyślną definicję, edytując sekcję dotyczącą minor-modes-alist.

Oczywiście wtedy musisz go zachować, co nie jest tak flashowe, więc wolisz zastąpić minor-mode-alistsymbol w ramach istniejącej wartości. Poniższe informacje są nieco specyficzne dla implementacji, ale na pewno ładniejsze niż ustawienie mode-line-modesw całości i można je włączać i wyłączać.

(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
źródło
Cóż, to smutne, że nie ma pakietu „rozkosz”.
Mark Karpov
2
Co do Emacsa, który jest stary, a pakiet.el jest nowy, istnieje mnóstwo przydatnych bibliotek, które nie mają pakietów. Jeśli masz zamiar ograniczyć się w ten sposób, sugeruję przyjrzenie się el-get, który będzie działał jako menedżer (wraz z aktualizacją) dla wielu różnych typów źródeł bibliotek.
phils
1
@Drew, wiem o load-pathi require. Kiedyś „instalowałem” wszystkie pakiety Emacsa w ten sposób, kiedy zacząłem z niego korzystać rok temu.
Mark Karpov
3
Właśnie dodałem delightdo MELPA.
sanityinc
1
nb delightjest obecnie w GNU ELPA, a nie w MELPA (wspomniane na wypadek, gdyby ktoś pomylił się w poprzednich komentarzach).
phils
8

Używaj bogatej mniejszości z konfiguracją:

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

Mam też taką myśl jak ty, ale skracam linię trybu bardziej paranoiczną :

  • Usuń wszystkie niechciane spacje
  • Usuń wszystkie spacje i „minimalną szerokość” pola informacji o pozycji bufora.
;; 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"))))))
      )

Teraz zawsze widzę powiadomienie w trybie Twitter i licznik trybu organizacji: D

kuanyui
źródło
5

Oto, co zadziałało dla mnie:

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

Dzięki komentarzowi Drew poprawiłem realizację tego rozwiązania. Teraz wykorzystuje zalety list asocjacyjnych i powinien być nieco bardziej wydajny ;-)

Mark Karpov
źródło
FWIW, nie wyłapie wcześniej wyładowanych mniejszych trybów, które są włączane ręcznie, ani trybów, które dynamicznie aktualizują ich jaśniejszy tekst (nie że inne biblioteki też to robią). Ale poza tym wydaje się to dość praktyczne podejście.
phils
1
Chodzi o minor-mode-alistbycie alist jest to, że wpisy mogą być dodawane i usuwane w cień i głowa do unshadow wpisy dalej w dół listy, które mają ten sam klucz. Jeśli chcesz robić to, co robisz, po prostu zmień pierwszy wpis (znaleziony za pomocą assoc, zmieniony za pomocą setcaritp.) Dla każdego klawisza, aby nie stracić tej przydatnej, zamierzonej funkcji.
Drew
@Drew, masz rację, zobacz moje ulepszone moje rozwiązanie.
Mark Karpov
Tak; o to mi chodziło.
Drew
3

Wrzucę też moje rozwiązanie tego na ring:

(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-lighterpozwala ustawić zapalniczkę trybu podrzędnego na dowolny ciąg, który ci się podoba. modeline-remove-lighterpozwala całkowicie usunąć zapalniczkę z mniejszego trybu.

Następnie na końcu mojego pliku init wywołuję te funkcje dla mniejszych trybów, których zapalniczki chcę zmodyfikować:

(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
źródło
2

Możesz również tępo usunąć wszystkie pomniejsze tryby w następujący sposób:

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

Będzie to również działać w przypadku mniejszych trybów zdefiniowanych w przyszłości, ponieważ po prostu całkowicie usuwa użycie minor-mode-alistz mode-line-format.

Stefan
źródło
1

Warto zauważyć, że use-package wspiera zmniejszanie i zachwyt . Jeśli używasz go do zarządzania pakietami, możesz ukryć pomniejsze tryby w wierszu trybu, dodając słowa kluczowe: zmniejsz lub: zachwyt.

(use-package abbrev
  :diminish abbrev-mode
  :config
  (if (file-exists-p abbrev-file-name)
     (quietly-read-abbrev-file)))
Marcos
źródło
0

Nie widzę sensu instalowania fantazyjnych nazwanych rozszerzeń dla czegoś tak prostego jak:

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

Na przykład:

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

W ten sposób możesz robić różne rzeczy. Zamiana tekstu jest oczywista z powyższego. Na przykład, aby umieścić tryb Flymake na początku listy:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
memeplex
źródło