Markierungsfarbe ändern, wenn das Fenster nicht scharfgestellt ist?

13

Ich benutze den HL-Modus als Nebenmodus für Geschicklichkeit. Wie ändere ich die Farbe der hervorgehobenen Linie (z. B. in Grau), wenn das geschickte Fenster nicht das aktuelle Fenster ist, und kehre dann zur Standard-Hervorhebungsfarbe zurück, wenn das geschickte Fenster wieder das aktuelle Fenster ist?

Shankar
quelle
Es hat sich herausgestellt, dass es hierfür eine Option gibt, siehe emacs.stackexchange.com/a/15141/780 .
Glucas

Antworten:

5

Ich habe dies für die hl-line-modeVerwendung der implementiert buffer-list-update-hook. Hier ist der Code:

(defface hl-line-inactive
  '((t nil))
  "Inactive variant of `hl-line'."
  :group 'hl-line)

(defun hl-line-update-face (window)
  "Update the `hl-line' face in WINDOW to indicate whether the window is selected."
  (with-current-buffer (window-buffer window)
    (when hl-line-mode
      (if (eq (current-buffer) (window-buffer (selected-window)))
          (face-remap-reset-base 'hl-line)
        (face-remap-set-base 'hl-line (face-all-attributes 'hl-line-inactive))))))

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

Was dieser Code macht:

  • Definieren Sie ein neues Gesicht hl-line-inactive, das in inaktiven Fenstern verwendet werden soll. Mit können Sie M-x customize-facedie Attribute dieses Gesichts nach Ihrem Geschmack ändern.
  • Definieren Sie eine Funktion, um das hervorgehobene Gesicht in inaktiven Fenstern vorübergehend neu zuzuordnen. Ein Fenster gilt als inaktiv, wenn es nicht denselben Puffer anzeigt wie das aktuell ausgewählte Fenster.
  • Fügen Sie einen Haken hinzu buffer-list-update-hook, der hl-line-update-facealle sichtbaren Fenster aufruft .

Alte Antwort

Der obige Code (den ich in meiner eigenen initDatei verwende) ist viel einfacher als der, den ich ursprünglich gepostet habe. Vielen Dank an @Drew für den Vorschlag walk-windows. Ich habe auch mehr über Face Remapping gelesen (siehe Face Remapping im Emacs Lisp-Handbuch) und festgestellt, dass ich einen Großteil des Codes entfernen kann.

Für die Nachwelt ist hier, was ich ursprünglich gepostet habe:

;; Define a face for the inactive highlight line.
(defface hl-line-inactive
  '((t nil))
  "Inactive variant of `hl-line'."
  :group 'local)

(defun toggle-active-window-highlighting ()
  "Update the `hl-line' face in any visible buffers to indicate which window is active."
  (let ((dups))
    (mapc
     (lambda (frame)
       (mapc
        (lambda (window)
          (with-current-buffer (window-buffer window)
            (when hl-line-mode
              (make-local-variable 'face-remapping-alist)
              (let ((inactive (rassoc '(hl-line-inactive) face-remapping-alist)))
                (if (eq window (selected-window))
                    (progn
                      (setq dups (get-buffer-window-list nil nil 'visible))
                      (setq face-remapping-alist (delq inactive face-remapping-alist)))
                  (unless (or inactive (memq window dups))
                    (add-to-list 'face-remapping-alist '(hl-line hl-line-inactive))))))))
        (window-list frame)))
     (visible-frame-list))))

(add-hook 'buffer-list-update-hook #'toggle-active-window-highlighting)
Glucas
quelle
Siehe auch Funktion walk-windows, mit der Sie über die Fenster von sichtbaren Frames usw. iterieren können (und +1 für buffer-list-update-hook, die von aufgerufen wird select-window.)
Drew
+1 dafür! Nicht so sehr für die hl-Linie, aber ich habe jahrelang hin und her gesucht, um einen zuverlässigen Weg zu finden, um die Hintergründe inaktiver Fenster in einem Frame zu schattieren. Das funktioniert! Vielen Dank!
Aaron Miller
Danke, das ist großartig! Leider scheint es Probleme bei der Benutzung zu geben global-hl-line-mode. Es scheint, dass global-hl-line-modenicht hl-line-modefür jeden Puffer geladen wird . Es wird eine Überlagerung verwendet, anstatt das hl-lineGesicht zu verwenden. Ich habe eine Weile ohne Glück damit herumgespielt. Irgendwelche Vorschläge? Sollte ich eine separate Frage öffnen?
Lorem Ipsum