Masquer la liste des modes mineurs dans la ligne de mode


22

J'utilise pas mal de modes mineurs et généralement je sais quel mode mineur est activé dans chaque mode majeur. Si je veux vraiment voir la liste complète, je peux courir C-h v minor-mode-list.

En même temps, ma ligne de mode est vraiment obstruée, donc quand je divise verticalement le cadre, parfois je ne peux pas lire la fin de la ligne de mode.

Question réelle: comment désactiver l'affichage de la liste des modes mineurs dans la ligne de mode? Par exemple, cela peut maintenant ressembler à ceci:

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

Je veux que cela paraisse plus concis:

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


2
Vous pouvez également examiner le mode riche-minoritaire .
Kaushal Modi

Réponses:


15

Le mode Diminuer (disponible dans Melpa) le fera.

(diminish 'projectile-mode)

2
Si vous voulez simplement raccourcir le nom du mode mineur au lieu de le cacher entièrement, vous pouvez utiliser(diminish 'projectile-mode "p")
erikstokes

5
Notez également que l' utilisation réelle de diminish est (eval-after-load "filladapt" '(diminish 'filladapt-mode))(en utilisant l'exemple du Wiki Emacs) et pas seulement (diminish 'filladapt-mode)comme suggéré par la réponse. Vous pouvez uniquement utiliser la version courte si le mode est garanti d'être déjà chargé.
phils

15

Comme l'a commenté mbork, vous pouvez utiliser delicious.el pour modifier ou désactiver sélectivement le texte du mode mineur (et même majeur) dans la ligne de mode.

L'un des avantages est qu'il prend en charge le eval-after-load(que vous devez écrire manuellement avec diminish.el dans la plupart des cas d'utilisation), ce qui rend la configuration plus propre. Vous avez toujours besoin des mêmes informations - le nom du mode et la bibliothèque qui l'implémente (qu'Emacs vous dira si vous lui posez des questions sur le mode) - mais vous pouvez tout résumer dans un seul formulaire:

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

(Ou suivez le lien ci-dessus pour des exemples d'utilisation réels.)

Je recommande cette approche, parce que même si vous ne voulez pas le plus du texte en mode mineur plus léger, il y a une bonne chance que vous trouverez quelques - uns d'entre eux utiles (et vous pouvez toujours modifier ceux - là pour être plus courte).

Si vous voulez vraiment éliminer tout le texte plus léger en mode mineur (et encore une fois, je ne le recommande pas), vous pouvez modifier la mode-line-modesvariable. Les variables de la ligne de mode ont changé il y a quelque temps, vous pouvez donc utiliser M-x find-variable RET mode-line-modes RETpuis adapter manuellement votre définition par défaut, en éditant la section concernant minor-modes-alist.

Bien sûr, vous devrez le maintenir, ce qui n'est pas si flash, vous préférerez donc peut-être remplacer le minor-mode-alistsymbole dans la valeur existante. Ce qui suit est quelque peu spécifique à l'implémentation, mais certainement plus agréable que le réglage mode-line-modesdans son intégralité, et vous pouvez l'activer et le désactiver.

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

Eh bien, c'est triste qu'il n'y ait pas de forfait «plaisir».
Mark Karpov

2
Avec Emacs étant ancien et package.el étant nouveau, il y a un tas de bibliothèques utiles qui n'ont pas de packages. Si vous vous limitez de cette façon, je vous suggère de regarder el-get qui agira en tant que gestionnaire (mise à jour incluse) pour une grande variété d'autres types de sources de bibliothèque.
phils

1
@Drew, je connais load-pathet require. J'avais l'habitude d '«installer» tous les packages Emacs de cette façon lorsque j'ai commencé à l'utiliser il y a un an.
Mark Karpov

3
Je viens d'ajouter delightà MELPA.
sanityinc

1
nb delightest dans GNU ELPA ces jours-ci, et non dans MELPA (mentionné au cas où quelqu'un serait confus par les commentaires précédents).
phils

8

Utilisez Rich-minority avec config:

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

J'ai aussi la pensée comme toi, mais je raccourcis la ligne de mode plus paranoïaque :

  • Supprimer tous les espaces indésirables
  • Supprimez tous les espaces et la "largeur minimale" du champ d'informations sur la position du tampon.
;; 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"))))))
      )

Maintenant, je peux toujours voir la notification en mode Twitter et le minuteur du mode Org: D


5

Voici ce qui a fonctionné pour moi:

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

Grâce au commentaire de Drew , j'ai amélioré la réalisation de cette solution. Maintenant, il utilise les avantages des listes d'associations et devrait être un peu plus efficace ;-)


FWIW, il n'attrapera pas les modes mineurs précédemment déchargés qui sont activés manuellement, ni les modes qui mettent à jour dynamiquement leur texte plus léger (pas que les autres bibliothèques le fassent non plus). Mais sinon, cela semble une approche raisonnablement pratique.
phils

1
Le point d' minor-mode-alistêtre un alist est que les entrées peuvent être ajoutées et supprimées à la tête à l' ombre et les entrées unshadow plus bas la liste qui ont la même clé. Si vous voulez faire le genre de chose que vous faites, changez simplement la première entrée (trouvée en utilisant assoc, modifiée en utilisant setcaretc.) pour chaque clé, afin de ne pas perdre cette fonctionnalité utile prévue.
Drew

@Drew, vous avez raison, voyez ma solution améliorée.
Mark Karpov

Ouaip; c'est ce que je voulais dire.
Drew

3

Je vais également lancer ma solution dans le 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-lightervous permet de régler le plus léger d'un mode mineur sur n'importe quelle chaîne que vous aimez. modeline-remove-lightervous permet de supprimer complètement le briquet d'un mode mineur.

Ensuite, à la fin de mon fichier init, j'appelle simplement ces fonctions pour les modes mineurs dont je souhaite modifier les briquets:

(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

Vous pouvez également supprimer sans ambages tous les modes mineurs, de la manière suivante:

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

Cela permettra également de travailler pour les modes mineurs définis à l'avenir, car il enlève juste complètement l'utilisation de minor-mode-alistdu mode-line-format.


1

Il convient de noter que les use-package supports diminuent et ravissent . Si vous l'utilisez pour gérer vos packages, vous pouvez masquer les modes mineurs dans la ligne de mode en ajoutant les mots clés: diminuer ou: ravir.

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

0

Je ne vois pas l'intérêt d'installer des extensions nommées fantaisies pour quelque chose d'aussi simple que:

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

Par exemple:

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

Vous pouvez faire toutes sortes de choses de cette façon. Le remplacement du texte est évident à partir de ce qui précède. Aussi, par exemple, pour mettre le mode flymake au début de la liste:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.