@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
、背景の暗さに基づいて顔を設定するようなものを直接使用するのは素晴らしいことでした。