창에 초점이 맞지 않을 때 하이라이트 색상을 변경 하시겠습니까?


13

hl-mode를 deft의 보조 모드로 사용하고 있습니다. deft 창이 현재 창이 아닌 경우 강조 표시된 선의 색상을 변경 (예 : 회색) 한 다음, deft 창이 다시 현재 창이되면 기본 강조 색으로 돌아가려면 어떻게해야합니까?


이에 대한 옵션이있는 것으로 나타 났습니다 (emacs.stackexchange.com/a/15141/780 참조) .
glucas

답변:


5

hl-line-mode사용 하기 위해 이것을 구현 했습니다 buffer-list-update-hook. 코드는 다음과 같습니다.

(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)))

이 코드가하는 일 :

  • hl-line-inactive비활성 창에서 사용할 새면을 정의하십시오 . M-x customize-face이 얼굴의 속성을 취향에 맞게 수정할 수 있습니다 .
  • 비활성 창에서 강조 표시면을 임시로 다시 매핑하는 기능을 정의하십시오. 창은 현재 선택된 창과 동일한 버퍼를 표시하지 않으면 비활성으로 간주됩니다.
  • 보이는 모든 창에 대한 buffer-list-update-hook호출 hl-line-update-face에 후크를 추가하십시오 .

이전 답변

위의 코드 (내 init파일 에서 사용 중 )는 원래 게시 한 것보다 훨씬 간단합니다. 사용할 제안에 대해 @Drew에게 감사드립니다 walk-windows. 또한 얼굴 리매핑에 대한 자세한 내용을 읽고 ( Emacs Lisp 설명서의 얼굴 리매핑 참조 ) 많은 코드를 제거 할 수 있다는 것을 깨달았습니다.

후손을 위해 내가 처음에 게시 한 내용은 다음과 같습니다.

;; 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)

walk-windows가시 프레임 등의 창을 반복하는 데 사용할 수있는 function도 참조하십시오 . (및에 대해 +1 buffer-list-update-hook은으로 호출됩니다 select-window.)
Drew

이것을 위해 +1! hl-line에 대해서는별로 중요하지 않지만 몇 년 동안 비활성 창 배경을 프레임으로 음영 처리하는 신뢰할 수있는 방법을 찾기 위해 몇 년 동안 찾고 있습니다. 작동합니다! 감사!
Aaron Miller

고마워요, 대단해요! 불행히도를 사용할 때 문제가있는 것 같습니다 global-hl-line-mode. 각 버퍼마다 global-hl-line-mode로드되지 않는 것 같습니다 hl-line-mode. hl-line얼굴 을 사용하는 대신 오버레이를 사용합니다 . 나는 운이없이 잠시 동안 그것을 다루고 있었다. 어떤 제안? 별도의 질문을 열어야합니까?
Lorem Ipsum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.