Bagaimana saya bisa mengesampingkan wajah yang telah ditentukan sebelumnya untuk latar belakang terang dan gelap?

9

Saya ingin menggunakan set-face-attributeuntuk memilih satu dari dua warna untuk latar depan tergantung pada apakah latar belakang tema saat ini terang atau gelap.

Perilaku yang diharapkan adalah bahwa latar depan berubah secara otomatis jika saya beralih dari tema latar belakang terang ke tema latar belakang gelap atau sebaliknya.

Berikut ini adalah use case:

Saya menyesuaikan wajah stripe-hl-linesebagai berikut:

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

Tapi saya ingin mengubah latar depan berdasarkan hanya jika temanya terang atau gelap. Dengan begitu saya tidak perlu khawatir tentang menyesuaikan wajah itu di setiap tema.

Kaushal Modi
sumber
Itu sesuatu yang biasanya dilakukan dalam definisi tema.
wasamasa
Meskipun bisa jadi rumit, sepertinya Anda bisa memanfaatkan colorperpustakaan di sini. Anda mungkin bisa mendapatkan nilai rgb atau hex dari latar belakang, menentukan beberapa nilai ambang untuk "gelap", dan mengatur latar depan yang sesuai.
Dan
@wasamasa Ya. Tetapi untuk beberapa wajah, saya tidak peduli tentang warna mereka yang khusus untuk tema. Saya telah memperbarui pertanyaan saya dengan contoh wajah yang ingin saya sesuaikan.
Kaushal Modi
@Dan Apa yang akan menjadi pengait yang tepat untuk mengevaluasi kembali hex latar belakang?
Kaushal Modi
ini adalah logika yang dapat Anda gunakan `(defface changing-face '((((background dark)): foreground" White ") (t: foreground" Black ")): grup' x-mode-faces)` ... Karena jika Anda ingin menggunakan wajah yang ada, maka Anda dapat menambahkan 2 garis tengah ke bentuk defface yang ada.
Madhavan

Jawaban:

9

Berkat @MadhavanKumar, saya fokus untuk mendapatkan solusi berdasarkan defface.

Saya menyadari bahwa saya tidak dapat mengganti yang sudah ada deffacetetapi saya selalu dapat membuat warna latar belakang saya sendiri sensitif defface. Kemudian satu-satunya pertanyaan adalah bagaimana cara menggunakan custom defface saya, bukan yang asli.

Saya akan menggunakan contoh yang sama dari menimpa stripe-hl-linewajah untuk berjalan melalui solusi. Wajah ini didefinisikan dalam paket stripe-buffer.

Berikut langkah-langkahnya:

Langkah 1. Tentukan milik Anda 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)

Ini akan menghasilkan warna latar depan my/stripe-hl-lineyang menghindar biru untuk latar belakang gelap dan merah untuk latar belakang terang.

Langkah 2. Buat fungsi untuk memetakan kembali wajah

The face-remap-add-relativeFungsi ini digunakan untuk memetakan wajah yang ada untuk wajah baru. Dalam hal ini, saya memetakan ulang stripe-hl-linewajah my/stripe-hl-line.

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

Langkah 3. Lakukan pemetaan ulang di lokasi yang sesuai

Dari stripe-buffersumbernya, saya melihat bahwa hl-linewajahnya dipetakan kembali ke stripe-hl-linemuka. Jadi kita perlu melakukan pemetaan ulang setelah terjadi pemetaan ulang (yang ada dalam stripe-listify-bufferdefinisi fungsi).

Jadi kami melakukan pemetaan ulang dengan memberi saran stripe-listify-buffermenggunakan kombinator.:after advice

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

Selesai!

Yang mengatakan, itu akan luar biasa untuk secara langsung menggunakan sesuatu seperti set-face-attributeuntuk mengatur wajah berdasarkan kegelapan latar belakang.

Kaushal Modi
sumber