Come posso sostituire un viso predefinito per sfondi chiari e scuri?


9

Vorrei usare set-face-attributeper scegliere uno dei due colori per il primo piano a seconda che lo sfondo del tema corrente sia chiaro o scuro.

Il comportamento previsto è che il primo piano cambia automaticamente se passo da un tema di sfondo chiaro a un tema di sfondo scuro o viceversa.

Ecco un caso d'uso:

Personalizzo il volto di stripe-hl-linecome segue:

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

Ma vorrei cambiare il primo piano basandomi solo se il tema è chiaro o scuro. In questo modo non devo preoccuparmi di personalizzare quella faccia in ogni tema.


È qualcosa che normalmente viene fatto nella definizione del tema.
wasamasa,

Anche se potrebbe essere complicato, sembra che tu possa fare uso della colorlibreria qui. Probabilmente potresti ottenere il valore rgb o esadecimale della faccia di sfondo, determinare un valore di soglia per "scuro" e impostare il primo piano di conseguenza.
Dan

@wasamasa Sì. Ma per alcuni volti, non mi interessa che il loro colore sia specifico per il tema. Ho aggiornato la mia domanda con una faccia di esempio che voglio personalizzare.
Kaushal Modi,

@Dan Quale sarebbe un hook appropriato per rivalutare l'esagono di sfondo?
Kaushal Modi,

questa è la logica che puoi usare `(defface changing-face '(((((dark background)): foreground" White ") (t: foreground" Black ")): group' x-mode-faces)` ... Poiché se si desidera utilizzare la faccia esistente, è possibile aggiungere le 2 linee centrali al modulo di defface esistente.
Madhavan,

Risposte:


9

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.