Як я можу змінити заздалегідь визначене обличчя для світлого та темного тла?


9

Я б хотів використати set-face-attributeдля вибору одного з двох кольорів для переднього плану залежно від того, світлий або темний фон поточної теми.

Очікувана поведінка полягає в тому, що передній план змінюється автоматично, якщо я перейду зі світлої теми тла на темну тему тла або навпаки.

Ось випадок використання:

Я налаштовую обличчя stripe-hl-lineтак:

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

Але я хотів би змінити передній план на основі лише того, якщо тема світла чи темна. Таким чином я не повинен турбуватися про налаштування цього обличчя в кожній темі.


Це зазвичай робиться у визначенні теми.
wasamasa

Хоча це може ускладнитися, здається, ви можете використати colorтут бібліотеку. Можливо, ви могли отримати значення rgb або hex значення фонового обличчя, визначити деяке порогове значення для "dark" та встановити передній план відповідно.
День

@wasamasa Так. Але для деяких облич мені байдуже, що їх колір специфічний для теми. Я оновив своє запитання прикладом обличчя, яке хочу налаштувати.
Каушал Моді

@Dan Що було б підходящим гаком для переоцінки фонового шестигранника?
Каушал Моді

це логіка, якою ви можете скористатися `(defface change-face '((((темний фон)): передній план" White ") (t: передній план" Black ")): група" x-mode-face "` ... Оскільки якщо ви хочете використовувати наявне обличчя, то ви можете додати середні 2 рядки до існуючої форми дефасе.
Мадхаван

Відповіді:


9

Завдяки @MadhavanKumar я зосередився на пошуку рішення на основі 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встановлення облич на основі темноти фону.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.