明るい背景と暗い背景の事前定義された顔を上書きするにはどうすればよいですか?


9

set-face-attribute現在のテーマの背景が明るいか暗いかに応じて、前景に2つの色のいずれかを使用したいと思います。

予想される動作は、明るい背景のテーマから暗い背景のテーマに、またはその逆に切り替えると、前景が自動的に変更されることです。

ここにユースケースがあります:

の顔をstripe-hl-line次のようにカスタマイズします。

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

でも、テーマが明るいか暗いかに基づいて前景を変えたいです。そうすれば、各テーマでその顔をカスタマイズすることを心配する必要はありません。


これは通常、テーマの定義で行われます。
ワサマサ2015

複雑になるかもしれませんが、colorここでライブラリを利用できるようです。おそらく、背景の顔のRGBまたは16進値を取得し、「暗い」のしきい値を決定し、それに応じて前景を設定できます。
ダン

@wasamasaはい。しかし、一部の顔については、その色がテーマに固有であることを気にしません。カスタマイズしたい顔の例で質問を更新しました。
Kaushal Modi、2015

@ダン背景ヘクスを再評価するための適切なフックは何でしょうか?
Kaushal Modi

これは、あなたが使用できるロジックです。既存の面を使用する場合は、中央の2行を既存のdeffaceフォームに追加できます。
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.