¿Cambiar el color de resaltado cuando la ventana no está enfocada?

13

Estoy usando el modo hl como modo menor para hábil. ¿Cómo hago que la línea resaltada cambie de color (por ejemplo, a gris) cuando la ventana hábil no es la ventana actual, y luego vuelvo al color de resaltado predeterminado cuando la ventana hábil se convierte nuevamente en la ventana actual?

Shankar
fuente
Resulta que hay una opción para esto, consulte emacs.stackexchange.com/a/15141/780 .
glucas

Respuestas:

5

He implementado esto para hl-line-modeusar el buffer-list-update-hook. Aquí está el código:

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

Lo que está haciendo este código:

  • Defina una nueva cara hl-line-inactivepara usar en ventanas inactivas. Puede usar M-x customize-facepara modificar los atributos de esta cara a su gusto.
  • Defina una función para reasignar temporalmente la cara resaltada en ventanas inactivas. Una ventana se considera inactiva si no muestra el mismo búfer que la ventana seleccionada actualmente.
  • Agregue un gancho a buffer-list-update-hookese llama hl-line-update-facepara todas las ventanas visibles.

Vieja respuesta

El código anterior (que estoy usando en mi propio initarchivo) es mucho más simple que lo que publiqué originalmente. Gracias @Drew por la sugerencia de usar walk-windows. También leí más sobre la reasignación de rostros (consulte Reasignación de rostros en el Manual de Emacs Lisp) y me di cuenta de que podía eliminar gran parte del código.

Para la posteridad, esto es lo que publiqué originalmente:

;; 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
fuente
Vea también la función walk-windows, que puede usar para iterar sobre las ventanas de marcos visibles, etc. (Y +1 para buffer-list-update-hook, que recibe la llamada select-window).
Dibujó el
+1 por esto! No tanto para las cosas de la línea hl en específico, pero he estado buscando de vez en cuando para encontrar una forma confiable de sombrear los fondos de ventanas inactivas en un marco. ¡Esto funciona! ¡Gracias!
Aaron Miller
Gracias, esto es genial! Desafortunadamente, parece tener problemas al usarlo global-hl-line-mode. Parece que global-hl-line-modeno se carga hl-line-modepara cada búfer. Utiliza una superposición en lugar de usar la hl-linecara. He estado jugando con eso por un tiempo sin suerte. ¿Alguna sugerencia? ¿Debo abrir una pregunta por separado?
Lorem Ipsum