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

Pregunta:

Estoy usando hl-mode como modo menor para deft. ¿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 vuelve a ser la ventana actual?

Respuesta:

Implementé esto para hl-line-mode usando 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)))

Qué está haciendo este código:

  • Defina una nueva cara hl-line-inactive para usar en ventanas inactivas. Puedes usar Mx customize-face para modificar los atributos de esta cara a tu 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-hook que llame a hl-line-update-face para todas las ventanas visibles.

Respuesta antigua

El código anterior (que estoy usando en mi propio archivo de init ) es mucho más simple de 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 Remapeado 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)

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım