Liste der Nebenmodi in der Moduszeile ausblenden

22

Ich verwende einige Nebenmodi und weiß normalerweise, welcher Nebenmodus in jedem Hauptmodus aktiviert ist. Wenn ich wirklich die vollständige Liste sehen möchte, kann ich ausführen C-h v minor-mode-list.

Gleichzeitig ist meine Moduszeile sehr verstopft. Wenn ich das Bild vertikal teile, kann ich manchmal das Ende der Moduszeile nicht lesen.

Aktuelle Frage: Wie deaktiviere ich die Anzeige der Liste der Nebenmodi in der Moduszeile? Zum Beispiel könnte es jetzt so aussehen:

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

Ich möchte, dass es prägnanter aussieht:

-:--- main.c        All (7,12)     (C/l) [main] 16:19
Mark Karpov
quelle
2
Sie können auch in den Rich-Minority- Modus schauen .
Kaushal Modi

Antworten:

15

Der Diminish-Modus (in Melpa verfügbar) erledigt dies.

(diminish 'projectile-mode)
Colin Bell
quelle
2
Wenn Sie nur den Namen des (diminish 'projectile-mode "p")
Nebenmodus
5
Beachten Sie auch, dass die tatsächliche Verwendung von diminish (eval-after-load "filladapt" '(diminish 'filladapt-mode))(anhand des Beispiels aus dem Emacs-Wiki) und nicht (diminish 'filladapt-mode)wie in der Antwort angegeben ist. Sie können die Kurzversion nur verwenden, wenn der Modus garantiert bereits geladen ist.
Phils
15

Wie mbork kommentierte, können Sie delight.el verwenden , um Text im Nebenmodus (und in der Tat im Hauptmodus) in der Moduszeile selektiv zu ändern oder zu deaktivieren.

Einer der Vorteile ist, dass es sich um das kümmert eval-after-load(was Sie in den meisten Anwendungsfällen manuell mit diminish.el schreiben müssen), was die Konfiguration übersichtlicher macht. Sie benötigen immer noch die gleichen Informationen - den Namen des Modus und die Bibliothek, die ihn implementiert (was Emacs Ihnen mitteilt, wenn Sie ihn nach dem Modus fragen), aber Sie können alles in eine einzige Form zusammenfassen:

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

(Oder folgen Sie dem obigen Link, um einige Beispiele für die reale Verwendung zu sehen.)

Ich würde empfehlen , diesen Ansatz, denn selbst wenn Sie nicht wollen , die meist kleineren Modi leichten Text, gibt es eine gute Chance, dass Sie einige von ihnen nützlich finden (und Sie können immer noch die diejenigen sein , kürzer ändern).

Wenn Sie wirklich alle leichteren Texte im Nebenmodus entfernen möchten (und ich empfehle es auch nicht), können Sie die mode-line-modesVariable ändern . Die Moduszeilenvariablen haben sich vor einiger Zeit geändert, sodass Sie möglicherweise M-x find-variable RET mode-line-modes RETIhre Standarddefinition verwenden und dann manuell anpassen möchten, indem Sie den entsprechenden Abschnitt bearbeiten minor-modes-alist.

Natürlich dann würden Sie sie halten müssen, was nicht so Blitz ist, so dass Sie das Ersetzen könnten es vorziehen , minor-mode-alistSymbol innerhalb des vorhandenen Wertes. Das Folgende ist etwas implementierungsspezifisch, aber auf jeden Fall besser als das Festlegen mode-line-modesin seiner Gesamtheit, und Sie können es ein- und ausschalten.

(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
quelle
Nun, es ist traurig, dass es kein "Vergnügen" -Paket gibt.
Mark Karpov
2
Was mit Emacs alt sein und package.el neu ist, gibt es einen Haufen von nützlichen Bibliotheken , die keine Pakete tun haben. Wenn Sie sich auf diese Weise einschränken möchten, sollten Sie sich el-get ansehen, das als Manager (einschließlich Aktualisierung) für eine Vielzahl anderer Bibliothekstypen fungiert.
Phils
1
@Drew, ich weiß von load-pathund require. Früher habe ich alle Emacs-Pakete auf diese Weise installiert, als ich vor einem Jahr damit angefangen habe.
Mark Karpov
3
Ich habe gerade delightzu MELPA hinzugefügt .
Sanityinc
1
nb delightist heutzutage in GNU ELPA und nicht in MELPA (erwähnt, falls jemand durch die vorherigen Kommentare verwirrt wird).
Phils
8

Verwenden Sie Rich-Minority mit config:

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

Ich habe auch den Gedanken wie du, aber ich verkürze die Mode-Zeile paranoider :

  • Entfernen Sie alle unerwünschten Leerzeichen
  • Entfernen Sie alle Leerzeichen und "Mindestbreite" des Pufferpositions-Infofelds.
;; 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"))))))
      )

Jetzt kann ich immer die Benachrichtigung im Twitter-Modus und den Timer im Org-Modus sehen: D

kuanyui
quelle
5

Folgendes hat bei mir funktioniert:

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

Dank Drews Kommentar habe ich die Umsetzung dieser Lösung verbessert. Jetzt nutzt es die Vorteile von Assoziationslisten und sollte ein bisschen effizienter sein ;-)

Mark Karpov
quelle
FWIW erkennt weder zuvor entladene Nebenmodi, die manuell aktiviert wurden, noch Modi, die ihren helleren Text dynamisch aktualisieren (nicht, dass die anderen Bibliotheken dies auch tun). Aber ansonsten scheint es ein vernünftiger praktischer Ansatz zu sein.
Phils
1
Der Sinn minor-mode-alisteiner Alist besteht darin, dass Einträge am Kopf hinzugefügt und entfernt werden können, um Einträge weiter unten in der Liste mit demselben Schlüssel zu beschatten und zu entfernen. Wenn Sie das tun möchten, was Sie gerade tun, ändern Sie einfach den ersten Eintrag (gefunden mit assoc, geändert mit setcarusw.) für jeden Schlüssel, damit Sie diese nützliche, beabsichtigte Funktion nicht verlieren.
Drew
@Drew, Du hast recht, siehe meine verbesserte meine Lösung.
Mark Karpov
Jep; Das ist es was ich meinte.
Drew
3

Ich werde meine Lösung auch in den Ring werfen:

(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-lighterMit dieser Option können Sie das Feuerzeug eines Moll-Modus auf eine beliebige Zeichenfolge einstellen. modeline-remove-lighterDamit können Sie das Feuerzeug eines Nebenmodus vollständig entfernen.

Dann rufe ich am Ende meiner Init-Datei einfach diese Funktionen für die Nebenmodi auf, deren Feuerzeuge ich ändern möchte:

(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
quelle
2

Sie können auch alle Nebenmodi auf folgende Weise entfernen:

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

Dies wird auch für kleinere Modi funktionieren, die in Zukunft definiert werden, da nur die Verwendung von minor-mode-alistaus der entfernt wird mode-line-format.

Stefan
quelle
1

Es ist erwähnenswert, dass dies use-package Abnehmen und Entzücken unterstützt . Wenn Sie es zum Verwalten Ihrer Pakete verwenden, können Sie die untergeordneten Modi in der Moduszeile ausblenden und die Schlüsselwörter: diminish oder: delight hinzufügen.

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

Ich sehe keinen Sinn darin, ausgefallene Namenserweiterungen für etwas so Einfaches wie:

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

Beispielsweise:

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

Sie können auf diese Weise jede Art von Sachen machen. Das Ersetzen von Text ist aus dem Obigen ersichtlich. Um beispielsweise den Flymake-Modus an den Anfang der Liste zu setzen:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
memeplex
quelle