Saya sudah menerapkan ini untuk hl-line-modemenggunakan 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-inactiveuntuk digunakan di windows tidak aktif. Anda dapat menggunakannya M-x customize-faceuntuk 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-hookpanggilan itu hl-line-update-faceuntuk semua jendela yang terlihat.
Jawaban lama
Kode di atas (yang saya gunakan dalam initfile 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)