Changer la face du mode-ligne-tampon-id pour les fenêtres inactives


8

Existe-t-il une face Emacs qui peut être utilisée pour contrôler la couleur des noms de tampons inactifs?

Normalement, lors du réglage de la face, mode-line-buffer-idtoutes les fenêtres sont affectées.

Dans cet exemple, le mode-linea un fond clair, j'ai donc réglé mode-line-buffer-idsur beaucoup plus sombre #333.

ligne de mode avec un tampon-id sombre sur fond clair

L'idée est d'inverser la combinaison de couleurs pour pour mode-line-inactive.

Bien que cela soit possible pour la plupart du texte dans la ligne de mode des fenêtres inactives, les noms des tampons deviennent illisibles car ils sont toujours contrôlés par le mode-line-buffer-idvisage.

mode-ligne-inactive avec id-tampon sombre sur fond sombre

Je crois qu'un réglage mode-line-inactivesur un fond plus clair contournerait le problème, mais ce n'est pas le résultat que je souhaite atteindre.

themes 

Voici un lien vers un exemple qui personnalise divers aspects de la ligne de mode: amitp.blogspot.com/2011/08/emacs-custom-mode-line.html
lawlist

Vous pouvez remapper un visage lorsque le tampon actif change comme décrit ici: emacs.stackexchange.com/a/14658/780
glucas

Réponses:


3

Je ne sais pas si vous cherchez toujours une réponse ou non, mais c'est le seul résultat que j'ai obtenu sur Google en essayant de le faire moi-même.

Quoi qu'il en soit, pour une raison quelconque, Emacs appelle cela, distant-foregrounddonc la seule chose que vous devez vraiment faire est d'ajouter :distant-foreground $colour-of-choiceà votre visage.


1

Voici une variante d'une autre réponse qui pourrait vous aider. Cet exemple remappe mode-line-buffer-idpour être vert dans les tampons inactifs.

(defun toggle-mode-line-buffer-id-face (window)
  "Update the `mode-line-buffer-id' face in WINDOW dependening on
whether the window is selected."
  (with-current-buffer (window-buffer window)
(if (eq (current-buffer) (window-buffer (selected-window)))
    (face-remap-reset-base 'mode-line-buffer-id)
  (face-remap-set-base 'mode-line-buffer-id '(:foreground "green")))))

(add-hook 'buffer-list-update-hook (lambda () (walk-windows #'toggle-mode-line-buffer-id-face nil t)))

Mise à jour: Comme indiqué dans les commentaires, cela ne résout pas entièrement le problème. Lorsque vous avez plusieurs fenêtres visibles visitant le même tampon, elles partagent toutes le même visage.


Malheureusement, un tampon peut être visible dans plusieurs fenêtres, où l'une peut être active et l'autre inactive.
Lindydancer

Certes, le remappage des visages s'applique au tampon et non à la fenêtre.
glucas

1

Il s'agit d'une variante des autres réponses, celle-ci distinguant les fenêtres actives et inactives. Si un tampon est visible dans plusieurs fenêtres, seule la fenêtre active aura ml-active-window-faceet les autres fenêtres auront toutes ml-inactive-window-face.

(defvar ml-selected-window nil)

(defun ml-record-selected-window ()
  (setq ml-selected-window (selected-window)))

(defun ml-update-all ()
  (force-mode-line-update t))

(add-hook 'post-command-hook 'ml-record-selected-window)

(add-hook 'buffer-list-update-hook 'ml-update-all)

(defface ml-active-window-face
   '((t (:foreground "red")))
   "Face for active buffer identification.")

(defface ml-inactive-window-face
   '((t (:foreground "green")))
   "Face for inactive buffer identification.")

(defun ml-propertized-buffer-identification (fmt)
  "Return a list suitable for `mode-line-buffer-identification'.
FMT is a format specifier such as \"%12b\".  This function adds
text properties for face, help-echo, and local-map to it."
  (list (propertize fmt
        'face
          (if (eq ml-selected-window (selected-window))
            'ml-active-window-face
            'ml-inactive-window-face)
        'help-echo
        (purecopy "Buffer name
mouse-1: Previous buffer\nmouse-3: Next buffer")
        'mouse-face 'mode-line-highlight
        'local-map mode-line-buffer-identification-keymap)))

(setq-default mode-line-buffer-identification
  '(:eval (ml-propertized-buffer-identification "%12b")))

Exemple


0

Je ne suis pas sûr que ce soit possible. Il semble que la ligne de mode ne soit mise à jour que lorsque sa fenêtre est sélectionnée (test à l'aide d'appels pour le messageconfirmer). Et le code qui le fait est le code C, pas Lisp.

Vous pouvez utiliser une expression conditionnelle dans la définition de mode-line-buffer-identification, afin que la face à utiliser soit calculée dynamiquement. Mais je ne connais aucune fonction ou variable que vous pouvez utiliser pour tester si une fenêtre donnée a une ligne de mode inactive.

Vous ne pouvez pas utiliser selected-window, par exemple, car cela pointe toujours vers la fenêtre avec la ligne de mode active.

Voici un exemple de mise à jour dynamique basée sur le nom du tampon. Ce n'est pas ce que vous voulez, mais cela vous montre au moins ce que vous pouvez faire. Si vous pouvez trouver un moyen de tester si la fenêtre en cours de mise à jour est sélectionnée, vous pouvez la remplacer par le test du nom du tampon. (Mais j'ai l'impression que seule la fenêtre sélectionnée obtient sa ligne de mode mise à jour.)

(setq-default mode-line-buffer-identification
              '(:eval
                (list (propertize "%b"
                       'face (if ;; NOPE (eq (selected-window) (get-buffer-window (current-buffer)))
                                 (eq (current-buffer) (get-buffer "some-buffer"))
                                 'mode-line-buffer-id
                               'some-other-face)
                       'help-echo "Buffer name mouse-1: Previous buffer\nmouse-3: Next buffer"
                       'mouse-face 'mode-line-highlight
                       'local-map mode-line-buffer-identification-keymap))))

Une autre chose que vous pourriez essayer est de conseiller la fonction format-mode-line. Il distingue apparemment une fenêtre avec une ligne de mode active de celle avec une ligne de mode inactive. Mais il est également codé en C, donc je doute que vous iriez très loin en le conseillant. Il teste la variable C Qmode_line_inactive, FWIW.

Je suggère de poser cette question sur l'une des listes de diffusion d'Emacs (par exemple help-gnu-emacs@gnu.org), si vous n'obtenez pas de réponse satisfaisante ici. On dirait qu'il pourrait être bon de pouvoir faire ce que vous demandez. +1 pour la question, en tout cas.


1
Juste pour compléter la réponse de Drew, la détection de tampon actif et les faces spécifiques de mode-ligne-tampon-id pour les tampons actifs et inactifs sont effectuées dans Powerline . Si vous voulez étudier le code, un bon point de départ est la fonction powerline-default-theme définie dans powerline-themes.el
deb0ch
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.