Cambia il colore di evidenziazione quando la finestra non è a fuoco?


13

Sto usando la modalità hl come modalità secondaria per deft. Come faccio a cambiare il colore della linea evidenziata (ad es. In grigio) quando la finestra predefinita non è la finestra corrente, e quindi al colore di evidenziazione predefinito quando la finestra predefinita diventa di nuovo la finestra corrente?


Si scopre che esiste un'opzione per questo, vedere emacs.stackexchange.com/a/15141/780 .
glucas,

Risposte:


5

Ho implementato questo per l' hl-line-modeutilizzo di buffer-list-update-hook. Ecco il codice:

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

Cosa sta facendo questo codice:

  • Definire una nuova faccia hl-line-inactiveda utilizzare in finestre inattive. Puoi usareM-x customize-face per modificare gli attributi di questa faccia secondo i tuoi gusti.
  • Definire una funzione per rimappare temporaneamente la faccia di evidenziazione in finestre inattive. Una finestra è considerata inattiva se non visualizza lo stesso buffer della finestra attualmente selezionata.
  • Aggiungi un hook a buffer-list-update-hookquello chiama hl-line-update-faceper tutte le finestre visibili.

Vecchia risposta

Il codice sopra (che sto usando nel mio initfile) è molto più semplice di quello che ho pubblicato in origine. Grazie @Drew per il suggerimento da utilizzare walk-windows. Ho anche letto di più sulla rimappatura del viso (vedi Face Remapping nel manuale di Emacs Lisp) e ho capito che potevo rimuovere molto del codice.

Per i posteri, ecco cosa ho pubblicato originariamente:

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

Vedi anche la funzione walk-windows, che puoi usare per scorrere le finestre dei frame visibili, ecc. (E +1 per buffer-list-update-hook, che viene chiamato da select-window.)
Disegnato l'

+1 per questo! Non tanto per la roba hl-line in particolare, ma ho cercato a lungo per trovare un modo affidabile per ombreggiare gli sfondi di finestre inattive in una cornice. Questo funziona! Grazie!
Aaron Miller,

Grazie, è fantastico! Sfortunatamente, sembra avere problemi durante l'utilizzo global-hl-line-mode. Sembra che global-hl-line-modenon si carichi hl-line-modeper ogni buffer. Usa una sovrapposizione invece di usare la hl-linefaccia. Ci sto provando da un po 'senza fortuna. Eventuali suggerimenti? Devo aprire una domanda separata?
Lorem Ipsum,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.