Grazie a @MadhavanKumar, mi sono concentrato sul derivare una soluzione basata su defface.
Mi sono reso conto che non posso ignorare un esistente deffacema 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-lineviso 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-lineviso 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-relativefunzione viene utilizzata per rimappare una faccia esistente in una nuova faccia. In questo caso, sto rimappando il stripe-hl-lineviso 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-bufferfonte, vedo che la hl-linefaccia è rimappata in stripe-hl-linefaccia. Quindi abbiamo bisogno di fare il nostro remapping dopo che si verifica quel remapping (che è nella stripe-listify-bufferdefinizione della funzione).
Quindi eseguiamo il remapping consigliando di stripe-listify-bufferusare 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-attributeper impostare i volti in base all'oscurità dello sfondo.