밝은 배경과 어두운 배경에 대해 사전 정의 된 얼굴을 재정의하려면 어떻게해야합니까?


9

set-face-attribute현재 테마의 배경이 밝은 지 어두운 지에 따라 전경의 두 가지 색상 중 하나를 선택하는 데 사용 하고 싶습니다 .

밝은 배경 테마에서 어두운 배경 테마로 또는 그 반대로 전환하면 전경이 자동으로 변경됩니다.

유스 케이스는 다음과 같습니다.

나는 stripe-hl-line다음과 같이 얼굴을 사용자 정의합니다 .

 (set-face-attribute 'stripe-hl-line nil
                        :overline   "gray"
                        :underline  "gray"
                        :foreground "dodger blue")

그러나 테마가 밝거나 어두운 경우에만 전경을 변경하고 싶습니다. 그렇게하면 각 테마에서 해당 얼굴을 사용자 정의하는 것에 대해 걱정할 필요가 없습니다.


그것은 테마 정의에서 일반적으로 수행되는 것입니다.
wasamasa

복잡해질 수 있지만 color여기서 라이브러리를 사용할 수있는 것처럼 보입니다 . 배경면의 RGB 또는 16 진수 값을 가져 와서 "어두운"에 대한 임계 값을 결정하고 이에 따라 전경을 설정할 수 있습니다.
Dan

@wasamasa 예. 그러나 일부 얼굴의 경우 테마에 고유 한 색상이 중요하지 않습니다. 사용자 정의하려는 예제 얼굴로 내 질문을 업데이트했습니다.
Kaushal Modi

@Dan 배경 헥스를 재평가하기위한 적절한 연결 고리는 무엇입니까?
Kaushal Modi

이것은 당신이 사용할 수있는 논리입니다. 기존면을 사용하려면 기존 defface 양식에 중간 2 줄을 추가 할 수 있습니다.
Madhavan

답변:


9

@MadhavanKumar 덕분에에 기반한 솔루션을 도출하는 데 집중했습니다 defface.

기존을 재정의 할 수는 없지만 defface항상 고유 한 배경색을 만들 수 있음을 깨달았습니다 defface. 그런 다음 유일한 질문은 원본 대신 내 사용자 정의 defface를 사용하는 방법이었습니다.

stripe-hl-line솔루션을 안내하기 위해 면을 재정의하는 동일한 예제를 사용합니다 . 이면은 패키지에 정의되어 stripe-buffer있습니다.

단계는 다음과 같습니다.

1 단계. 자신을 정의하십시오 defface

(defface my/stripe-hl-line
  '((((background dark))  (:overline "gray" :underline "gray" :foreground "dodger blue"))
    (t                    (:overline "gray" :underline "gray" :foreground "red")))
  "Bold face for highlighting the current line in Hl-Line mode."
  :group 'stripe-buffer)

그러면 어두운 배경 에서는 my/stripe-hl-line얼굴 의 전경색 이 파란색으로 , 밝은 배경에서는 빨간색 으로 표시됩니다.

2 단계.면을 다시 매핑하는 함수 만들기

face-remap-add-relative기능은 기존면을 새면에 다시 매핑하는 데 사용됩니다. 이 경우 stripe-hl-line얼굴을에 다시 매핑합니다 my/stripe-hl-line.

(defun my/stripe-hl-line-face-remap ()
  (face-remap-add-relative 'stripe-hl-line 'my/stripe-hl-line))

3 단계. 적절한 위치에서 다시 매핑

로부터 stripe-buffer소스, 내가 볼 hl-line얼굴에 매핑되는 stripe-hl-line얼굴. 따라서 리매핑이 발생한 후 ( stripe-listify-buffer함수 정의에 있음) 리매핑을 수행해야합니다 .

콤비 네이터를 stripe-listify-buffer사용하여 조언함으로써 리매핑 을합니다 .:after advice

(advice-add 'stripe-listify-buffer :after #'my/stripe-hl-line-face-remap)

끝난!

set-face-attribute, 배경 어둠을 기반으로 얼굴을 설정 하는 것과 같은 것을 직접 사용하는 것이 좋을 것 입니다.

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