Açık ve koyu arka planlar için önceden tanımlanmış bir yüzü nasıl geçersiz kılabilirim?


9

set-face-attributeGeçerli temanın arka planının açık veya koyu olmasına bağlı olarak ön plan için iki renkten birini seçmek için kullanmak istiyorum .

Beklenen davranış, açık renkli bir arka plan temasından koyu bir arka plan temasına geçersem ön planın otomatik olarak değişmesidir.

İşte bir kullanım örneği:

Yüzünü stripe-hl-lineaşağıdaki gibi özelleştiriyorum :

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

Ancak ön temayı, temanın açık veya koyu olmasına bağlı olarak değiştirmek istiyorum. Bu şekilde her temada o yüzü özelleştirme konusunda endişelenmem gerekmiyor.


Bu tema tanımında normal olarak yapılan bir şeydir.
wasamasa

Her ne kadar karmaşık olabilse de, buradaki colorkütüphaneyi kullanabileceğiniz anlaşılıyor . Arka plan yüzünün rgb veya hex değerini alabilir, "karanlık" için bir eşik değeri belirleyebilir ve ön planı buna göre ayarlayabilirsiniz.
Dan

@wasamasa Evet. Ancak bazı yüzler için renklerinin temaya özgü olması umurumda değil. Sorumu özelleştirmek istediğim örnek bir yüzle güncelledim.
Kaushal Modi

@Dan Arka plan hex'i yeniden değerlendirmek için uygun bir kanca ne olurdu?
Kaushal Modi

bu kullanabileceğiniz mantık `` (yüz değiştiren yüzü defface '' ((((arka plan koyu)): ön plan "Beyaz") (t: ön plan "Siyah")): grup 'x-mod-yüzleri) `... Varolan yüzü kullanmak istiyorsanız, ortadaki 2 satırı mevcut defface formuna ekleyebilirsiniz.
Madhavan

Yanıtlar:


9

@MadhavanKumar sayesinde, bir çözüm üretmeye odaklandım defface.

Mevcut olanları geçersiz kılamayacağımı fark ettim deffaceama her zaman kendi arka plan rengime duyarlı oluşturabiliyorum defface. Sonra tek soru orijinal yerine benim özel defface kullanmak oldu.

stripe-hl-lineÇözümü dolaşmak için yüzü geçersiz kılma örneğini kullanacağım . Bu yüz pakette tanımlanmıştır stripe-buffer.

İşte adımlar:

Adım 1. Kendinizi tanımlayın 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)

Bu, my/stripe-hl-lineyüzün ön plan renginin koyu arka planlar için mavi ve açık arka planlar için kırmızı olmasına neden olur .

Adım 2. Yüzü yeniden eşleştirmek için bir işlev oluşturun

face-remap-add-relativeFonksiyon yeni bir yüz için varolan yüzünü yeniden eşleştirmek için kullanılır. Bu durumda, stripe-hl-lineyüzü yeniden eşleştiriyorum my/stripe-hl-line.

(defun my/stripe-hl-line-face-remap ()
  (face-remap-add-relative 'stripe-hl-line 'my/stripe-hl-line))

Adım 3. Yeniden eşlemeyi uygun bir yerde yapın

Gönderen stripe-bufferkaynağı, bunu görebiliyorum hl-lineyüz için remapped stripe-hl-lineyüzü. Dolayısıyla, yeniden eşleme işlemimizi bu yeniden eşleme gerçekleştikten sonra yapmamız gerekir ( stripe-listify-bufferişlev tanımındadır).

Böylece yeniden eşleştirmemizi birleştiriciyi stripe-listify-bufferkullanmanızı tavsiye ederek yapıyoruz .:after advice

(advice-add 'stripe-listify-buffer :after #'my/stripe-hl-line-face-remap)

Bitti!

Bununla set-face-attributebirlikte, arka plan karanlığına göre yüz ayarlamak gibi doğrudan bir şey kullanmak harika olurdu .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.