Tôi đã thực hiện điều này để hl-line-mode
sử dụng buffer-list-update-hook
. Đây là mã:
(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)))
Mã này đang làm gì:
- Xác định một khuôn mặt mới
hl-line-inactive
sẽ được sử dụng trong các cửa sổ không hoạt động. Bạn có thể sử dụng M-x customize-face
để sửa đổi các thuộc tính của khuôn mặt này theo sở thích của bạn.
- Xác định một chức năng để tạm thời ánh xạ lại khuôn mặt nổi bật trong các cửa sổ không hoạt động. Một cửa sổ được coi là không hoạt động nếu nó không hiển thị cùng bộ đệm với cửa sổ hiện được chọn.
- Thêm một cái móc vào
buffer-list-update-hook
đó gọi hl-line-update-face
cho tất cả các cửa sổ có thể nhìn thấy.
Câu trả lời cũ
Mã ở trên (mà tôi đang sử dụng trong init
tệp của riêng tôi ) đơn giản hơn nhiều so với những gì tôi đã đăng ban đầu. Cảm ơn @Drew đã gợi ý sử dụng walk-windows
. Tôi cũng đọc thêm về ánh xạ lại khuôn mặt (xem Ánh xạ khuôn mặt trong Hướng dẫn Lisp của Emacs) và nhận ra rằng tôi có thể loại bỏ rất nhiều mã.
Đối với hậu thế, đây là những gì tôi đã đăng ban đầu:
;; 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)