Chciałbym użyć, set-face-attribute
aby wybrać jeden z dwóch kolorów na pierwszym planie, w zależności od tego, czy tło bieżącego motywu jest jasne, czy ciemne.
Oczekiwanym zachowaniem jest to, że pierwszy plan zmienia się automatycznie, jeśli przełączę się z motywu jasnego tła na motyw ciemnego tła lub odwrotnie.
Oto przypadek użycia:
Dostosowuję twarz w stripe-hl-line
następujący sposób:
(set-face-attribute 'stripe-hl-line nil
:overline "gray"
:underline "gray"
:foreground "dodger blue")
Chciałbym jednak zmienić pierwszy plan na podstawie tego, czy motyw jest jasny czy ciemny. W ten sposób nie muszę się martwić o dostosowanie tej twarzy w każdym motywie.
color
biblioteki tutaj. Prawdopodobnie można uzyskać wartość rgb lub heksadecymalną powierzchni tła, określić wartość progową dla „ciemności” i odpowiednio ustawić pierwszy plan.Odpowiedzi:
Dzięki @MadhavanKumar skupiłem się na opracowaniu rozwiązania opartego na
defface
.Uświadomiłem sobie, że nie mogę zastąpić istniejącego,
defface
ale zawsze mogę stworzyć własne, wrażliwe na kolor tładefface
. Wtedy jedynym pytaniem było, jak użyć mojej niestandardowej definicji zamiast oryginalnej.Użyję tego samego przykładu przesłonięcia
stripe-hl-line
twarzy, aby przejść przez rozwiązanie. Ta twarz jest zdefiniowana w pakieciestripe-buffer
.Oto kroki:
Krok 1. Zdefiniuj własny
defface
Spowoduje to, że kolor pierwszego planu
my/stripe-hl-line
twarzy będzie unikalny na niebiesko dla ciemnego tła i czerwony na jasnym tle.Krok 2. Utwórz funkcję ponownego mapowania twarzy
face-remap-add-relative
Funkcja służy do przemapować istniejący twarzą nowej twarzy. W tym przypadku mapujęstripe-hl-line
twarz domy/stripe-hl-line
.Krok 3. Wykonaj ponowne mapowanie w odpowiednim miejscu
Ze
stripe-buffer
źródła widzę, żehl-line
twarz jest odwzorowana nastripe-hl-line
twarz. Musimy więc wykonać ponowne mapowanie po tym, jak to nastąpi (co jest wstripe-listify-buffer
definicji funkcji).Dokonujemy więc mapowania, doradzając
stripe-listify-buffer
za pomocą kombinatora.:after
advice
Gotowy!
To powiedziawszy, byłoby wspaniale bezpośrednio użyć czegoś takiego, jak
set-face-attribute
ustawić twarze na podstawie ciemności tła.źródło