Ändern Sie die Modus-Zeilenpuffer-ID für inaktive Fenster


8

Gibt es ein Emacs-Gesicht, mit dem die Farbe inaktiver Puffernamen gesteuert werden kann?

Normalerweise sind beim Einstellen des Gesichts mode-line-buffer-idalle Fenster betroffen.

In diesem Beispiel mode-linehat der einen hellen Hintergrund, daher habe ich mode-line-buffer-ideinen viel dunkleren eingestellt #333.

Moduszeile mit dunkler Puffer-ID auf hellem Hintergrund

Die Idee ist, die Farbkombination für for umzukehren mode-line-inactive.

Während dies für den größten Teil des Textes in der Moduszeile inaktiver Fenster möglich ist, werden die Puffernamen unlesbar, da sie immer noch vom mode-line-buffer-idGesicht gesteuert werden .

mode-line-inactive mit dunkler Puffer-ID auf dunklem Hintergrund

Ich glaube, dass die Einstellung mode-line-inactiveauf einen helleren Hintergrund das Problem umgehen würde, aber das ist nicht das Ergebnis, das ich erreichen möchte.

themes 

Hier ist ein Link zu einem Beispiel, das verschiedene Aspekte der Moduszeile
anpasst

Sie können ein Gesicht neu zuordnen, wenn sich der aktive Puffer wie hier beschrieben ändert: emacs.stackexchange.com/a/14658/780
glucas

Antworten:


3

Ich bin mir nicht sicher, ob Sie noch nach einer Antwort suchen oder nicht, aber dies war das einzige Ergebnis, das ich bei Google erhalten habe, als ich versucht habe, dies selbst zu tun.

Wie auch immer, aus welchem ​​Grund auch immer Emacs dies nennt distant-foreground, das einzige, was Sie wirklich tun müssen, ist :distant-foreground $colour-of-choice, Ihrem Gesicht etwas hinzuzufügen .


1

Hier ist eine Variation einer anderen Antwort , die helfen könnte. In diesem Beispiel wird mode-line-buffer-idin inaktiven Puffern erneut grün angezeigt .

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

Update: Wie in den Kommentaren erwähnt, wird das Problem dadurch nicht vollständig gelöst. Wenn mehrere sichtbare Fenster denselben Puffer besuchen, haben alle dasselbe Gesicht.


Leider kann ein Puffer in mehr als einem Fenster sichtbar sein, in dem eines aktiv und eines inaktiv sein kann.
Lindydancer

Richtig, die Neuzuordnung von Gesichtern gilt für den Puffer und nicht für das Fenster.
Glucas

1

Dies ist eine Variation der anderen Antworten, wobei diese zwischen aktiven und inaktiven Fenstern unterscheidet. Wenn ein Puffer in mehr als einem Fenster sichtbar ist, hat nur das aktive Fenster ml-active-window-faceund die anderen Fenster alle 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")))

Beispiel


0

Ich bin mir nicht sicher, ob es möglich ist. Es scheint, dass die Moduszeile nur aktualisiert wird, wenn ihr Fenster ausgewählt ist (Testen mit Aufrufen vonmessage dies zu bestätigen). Und der Code, der dies tut, ist C-Code, nicht Lisp.

Sie können einen bedingten Ausdruck in der Definition von verwenden mode-line-buffer-identification , damit das zu verwendende Gesicht dynamisch berechnet wird. Ich kenne jedoch keine Funktion oder Variable, mit der Sie testen können, ob ein bestimmtes Fenster eine inaktive Moduszeile hat.

Sie können nicht verwenden selected-window zum Beispiel , da dies immer auf das Fenster mit der aktiven Moduszeile zeigt.

Hier ist ein Beispiel für eine dynamische Aktualisierung, die auf dem Puffernamen basiert. Es ist nicht das, was Sie wollen, aber es zeigt Ihnen zumindest, was Sie tun können. Wenn Sie eine Möglichkeit finden, zu testen, ob das zu aktualisierende Fenster ausgewählt ist, können Sie diese durch den Puffernamen-Test ersetzen. (Mein Eindruck ist jedoch, dass nur die ausgewählte Moduszeile des ausgewählten Fensters aktualisiert wird.)

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

Eine andere Sache, die Sie versuchen könnten, ist die Beratung der Funktion format-mode-line. Es unterscheidet anscheinend ein Fenster mit einer aktiven Moduszeile von einem Fenster mit einer inaktiven Moduszeile. Aber es ist auch in C codiert, daher bezweifle ich, dass Sie mit der Beratung sehr weit kommen werden. Es testet die C-VariableQmode_line_inactive FWIW.

Ich würde vorschlagen, diese Frage auf einer der Emacs-Mailinglisten zu stellen (z. B. help-gnu-emacs@gnu.org), wenn Sie hier keine zufriedenstellende Antwort erhalten. Es scheint gut zu sein, das tun zu können, was Sie verlangen. Auf jeden Fall +1 für die Frage.


1
Um Drews Antwort zu vervollständigen, werden die aktive Puffererkennung und bestimmte Moduszeilen-Puffer-ID-Flächen für aktive und inaktive Puffer in Powerline ausgeführt . Wenn Sie den Code untersuchen möchten, ist die in powerline-theme.el
deb0ch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.