hl-line-mode 숨기기 배경, 이것을 피하는 방법?


10

와:

(when window-system
  (set-face-background 'hl-line "light yellow")
  (global-hl-line-mode 1))

현재 줄은 노란색 배경으로 강조 표시되지만 텍스트에 배경 속성이있는 경우 다른 모드 (예 : diff-mode, rainbow-mode)도 덮어 씁니다.

적절한 속성이없는 부분에 대해서만 배경을 설정할 수 있습니까?

업데이트 실험을 시작했는데 점각이 배경과 충돌하지 않는 것 같습니다.

(set-face-stipple 'hl-line '(4 4 "\x01\x00\x00\x00"))
(set-face-attribute 'hl-line nil :inherit nil)

그러나 점각은 불행하게도 텍스트 모양을 손상시킵니다 ...


1
고려할 수있는 또 다른 가능성은 각 hl-line 명령 루프의 끝 부분에있는 제거 기능으로, 현재 행의 시작부터 현재 행의 끝까지 (또는 (해당되는 경우 현재 시각 라인) 및 hl- 라인 오버레이면을 다른 배경색을 가진 다른 텍스트가있는 곳에서 제거 할 수 있습니다. 다른 오버레이 (예 : 플라이 스펠 오류 / 중복)로 강조 표시했을 수도 있지만 글꼴 잠금으로 강조 표시를 검색했을 수 있습니다.
lawlist

@lawlist 저는 그 구현에 관심이 있습니다. 아래에 전체 솔루션을 추가 할 수 있습니까?
Kaushal Modi

@ kaushalmodi-특정 오버레이 또는 원시 텍스트에 대해이 작업을 수행하는 방법을 알고 있지만 특정 텍스트 속성 / 글꼴 잠금 강조 표시에는 해당되지 않습니다. 이 질문에 올바르게 대답하기 위해 후자의 두 가지 발생을 테스트하는 방법을 연구해야하기 때문에 대신 의견을 작성하기로 결정했습니다. 다음은 [Drew의 라이브러리 중 하나에서 빌려온] 스 니펫으로 특정 오버레이를 테스트합니다. (when (memq NAME-OF-FACE (mapcar (function (lambda (ovr) (overlay-get ovr 'face))) (overlays-at (point)))) (remove-overlays BEGINNING-POINT ENDING-POINT 'face hl-line))
lawlist

답변:


5

문제는 때때로 텍스트 속성 face이 강조 표시에 사용되고 hl-line-mode오버레이를 사용한다는 것입니다. 그리고 오버레이는 항상 텍스트 속성 "위에"표시 face강조 .

diff-mode예를 들어 오버레이가 아닌 텍스트 속성을 사용합니다. 따라서 이와 같은 경우 운이 없습니다.

다음 중 하나가 강조하는 것은 오버레이에 의해 생산을위한 그러나 당신은 단지 HL-라인 오버레이 오버레이 우선 순위를 줄일 수 있습니다 hl-line-overlay또는 global-hl-line-overlay그 오버레이가 다른 오버레이 강조 "아래"로 나타납니다 그래서.

라이브러리 hl-line+.el를 사용하는 경우 옵션 hl-line-overlay-priority을 사용하여 오버레이 우선 순위를 설정할 수 있습니다 . Emacs Wiki 페이지 Highlight Current Line 도 참조하십시오 . (다시 강조 표시가 오버레이에서 비롯된 경우 오버레이 우선 순위를 변경해도 아무런 영향이 없습니다.)


대답 해줘서 고마워요. 나는 얼굴과 오버레이의 차이에 대해 신경 쓰지 않는다 ... +1
gavenkoa

해당 hl-line-overlay부동산에 어떻게 접근 합니까? 예를 들어에 나타나지 않습니다 customize-variable.
9000

@ 9000 : 대답에서 알 수 있듯이 라이브러리 hl-line+.el를 사용하는 경우 옵션 만 사용자 정의하십시오 hl-line-overlay-priority. 그렇지 않으면 미리 정의 된 기능을 재정의하거나 조언하는 경우를 제외하고는 할 수 없습니다. 이것이이 사용자 옵션을 제공하는 시점입니다.
Drew

3

부분 솔루션으로 끝납니다-줄 끝에서만 강조하십시오.

(defun my-hl-line-range-function ()
  (cons (line-end-position) (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

(when window-system
  (require 'hl-line)
  (set-face-attribute 'hl-line nil :inherit nil :background "light yellow")
  (setq global-hl-line-sticky-flag t)
  (global-hl-line-mode 1))

2

hl-line배경을 재정의 하지 않으려 고 시도 할 때이 질문에 걸려 들었습니다 (이 경우 들여 쓰기 안내 인 경우에도).

들여 쓰기 후에 강조 표시 선 그리기 시작합니다 .

(defun my-hl-line-range-function ()
  (cons
   (+ (line-beginning-position 1) (current-indentation))
   (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

교체 (+ (line-beginning-position 1) (current-indentation))(point), 너무 작업 (커서에서 시작).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.