如何覆盖浅色和深色背景的预定义面孔?


9

我想set-face-attribute根据当前主题的背景是浅色还是深色来为前景选择两种颜色之一。

预期的行为是,如果我从浅色背景主题切换到深色背景主题,前景会自动更改,反之亦然。

这是一个用例:

我自定义stripe-hl-line如下:

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

但是我想根据主题是浅色还是深色来更改前景。这样,我不必担心在每个主题中自定义该面孔。


这通常是在主题定义中完成的。
wasamasa 2015年

尽管它可能会变得复杂,但似乎您可以在color此处使用该库。您可能可以获得背景脸的rgb或hex值,确定“暗”的某个阈值,然后相应地设置前景。

@wasamasa是的。但是对于某些面孔,我不在乎它们的颜色是特定于主题的。我用想要自定义的示例面孔更新了我的问题。
Kaushal Modi 2015年

@Dan什么是重新评估背景十六进制的合适钩子?
Kaushal Modi 2015年

这是可以使用的逻辑((换面换脸'(((((背景暗)):前景“ White”)(t:前景“黑色”)):group'x-mode-faces)......由于如果要使用现有的面,则可以将中间的2行添加到现有的defface表单中。
Madhavan,2015年

Answers:


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基于背景黑暗设置面孔的功能真是太棒了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.