Saya sudah menerapkan ini untuk hl-line-mode
menggunakan buffer-list-update-hook
. Berikut kodenya:
(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)))
Apa yang dilakukan kode ini:
- Tentukan wajah baru
hl-line-inactive
untuk digunakan di windows tidak aktif. Anda dapat menggunakannya M-x customize-face
untuk memodifikasi atribut wajah ini sesuai selera Anda.
- Tetapkan fungsi untuk memetakan sementara wajah sorotan di jendela yang tidak aktif. Sebuah jendela dianggap tidak aktif jika tidak menampilkan buffer yang sama dengan jendela yang saat ini dipilih.
- Tambahkan hook ke
buffer-list-update-hook
panggilan itu hl-line-update-face
untuk semua jendela yang terlihat.
Jawaban lama
Kode di atas (yang saya gunakan dalam init
file saya sendiri ) jauh lebih sederhana daripada apa yang saya posting sebelumnya. Terima kasih @Drew atas saran untuk digunakan walk-windows
. Saya juga membaca lebih lanjut tentang remapping wajah (lihat Face Remapping dalam Manual Emacs Lisp) dan menyadari bahwa saya dapat menghapus banyak kode.
Untuk anak cucu, inilah yang awalnya saya posting:
;; 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)