Grazie a @MadhavanKumar, mi sono concentrato sul derivare una soluzione basata su defface
.
Mi sono reso conto che non posso ignorare un esistente defface
ma posso sempre creare il mio sfondo sensibile al colore defface
. Quindi l'unica domanda era come usare il mio defface personalizzato invece dell'originale.
Userò lo stesso esempio di scavalcamento del stripe-hl-line
viso per esaminare la soluzione. Questa faccia è definita nel pacchetto stripe-buffer
.
Ecco i passaggi:
Passaggio 1. Definisci il tuo 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)
Ciò comporterà che il colore di primo piano del my/stripe-hl-line
viso diventa blu scuro per gli sfondi scuri e rosso per gli sfondi chiari.
Passaggio 2. Creare una funzione per rimappare il viso
La face-remap-add-relative
funzione viene utilizzata per rimappare una faccia esistente in una nuova faccia. In questo caso, sto rimappando il stripe-hl-line
viso my/stripe-hl-line
.
(defun my/stripe-hl-line-face-remap ()
(face-remap-add-relative 'stripe-hl-line 'my/stripe-hl-line))
Passaggio 3. Eseguire la rimappatura nella posizione appropriata
Dalla stripe-buffer
fonte, vedo che la hl-line
faccia è rimappata in stripe-hl-line
faccia. Quindi abbiamo bisogno di fare il nostro remapping dopo che si verifica quel remapping (che è nella stripe-listify-buffer
definizione della funzione).
Quindi eseguiamo il remapping consigliando di stripe-listify-buffer
usare il combinatore.:after
advice
(advice-add 'stripe-listify-buffer :after #'my/stripe-hl-line-face-remap)
Fatto!
Detto questo, sarebbe stato fantastico usare direttamente qualcosa di simile set-face-attribute
per impostare i volti in base all'oscurità dello sfondo.