Thay đổi màu tô sáng khi cửa sổ không tập trung?


13

Tôi đang sử dụng chế độ hl như một chế độ nhỏ cho khéo léo. Làm cách nào để làm cho dòng được tô sáng thay đổi màu (ví dụ như màu xám) khi cửa sổ deft không phải là cửa sổ hiện tại, và sau đó quay lại màu tô sáng mặc định khi cửa sổ deft trở lại cửa sổ hiện tại?


Hóa ra có một tùy chọn cho việc này, xem emacs.stackexchange.com/a/15141/780 .
glucas

Câu trả lời:


5

Tôi đã thực hiện điều này để hl-line-modesử 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-inactivesẽ đượ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-facecho 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 inittệ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)

Xem thêm chức năng walk-windowsmà bạn có thể sử dụng để lặp lại qua các cửa sổ của các khung có thể nhìn thấy, v.v. (Và +1 cho buffer-list-update-hook, được gọi bởi select-window.)
vẽ

+1 cho việc này! Không quá nhiều cho các công cụ hl-line cụ thể, nhưng tôi đã tìm kiếm nhiều năm để tìm ra cách đáng tin cậy để che nền của các cửa sổ không hoạt động trong một khung. Những công việc này! Cảm ơn!
Aaron Miller

Cảm ơn bạn, điều này là tuyệt vời! Thật không may, nó dường như có vấn đề khi sử dụng global-hl-line-mode. Dường như global-hl-line-modekhông tải hl-line-modecho mỗi bộ đệm. Nó sử dụng một lớp phủ thay vì sử dụng hl-linekhuôn mặt. Tôi đã loay hoay với nó trong một thời gian không có may mắn. Bất kỳ đề xuất? Tôi có nên mở một câu hỏi riêng biệt?
Lorem Ipsum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.