Comment remplacer un visage prédéfini pour les arrière-plans clairs et foncés?

9

Je voudrais utiliser set-face-attributepour choisir l'une des deux couleurs pour le premier plan selon que l'arrière-plan du thème actuel est clair ou sombre.

Le comportement attendu est que le premier plan change automatiquement si je passe d'un thème d'arrière-plan clair à un thème d'arrière-plan sombre ou vice-versa.

Voici un cas d'utilisation:

Je personnalise le visage de stripe-hl-linecomme suit:

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

Mais je voudrais changer le premier plan en fonction du fait que le thème soit clair ou sombre. De cette façon, je n'ai pas à me soucier de personnaliser ce visage dans chaque thème.

Kaushal Modi
la source
C'est quelque chose qui se fait normalement dans la définition du thème.
wasamasa
Bien que cela puisse devenir compliqué, il semble que vous puissiez utiliser la colorbibliothèque ici. Vous pouvez probablement obtenir la valeur RVB ou hexadécimale de la face d'arrière-plan, déterminer une valeur de seuil pour "sombre" et définir le premier plan en conséquence.
Dan
@wasamasa Oui. Mais pour certains visages, je me fiche que leur couleur soit spécifique au thème. J'ai mis à jour ma question avec un exemple de visage que je souhaite personnaliser.
Kaushal Modi
@Dan Quel serait un crochet approprié pour réévaluer l'hex de fond?
Kaushal Modi
c'est la logique que vous pouvez utiliser `(defface change-face '((((fond sombre)): premier plan" Blanc ") (t: premier plan" Noir ")): groupe' x-mode-faces)` ... Puisque si vous souhaitez utiliser la face existante, vous pouvez ajouter les 2 lignes du milieu au formulaire de déface existant.
Madhavan

Réponses:

9

Grâce à @MadhavanKumar, je me suis concentré sur la dérivation d'une solution basée sur defface.

J'ai réalisé que je ne peux pas remplacer un existant deffacemais je peux toujours créer ma propre couleur de fond sensible defface. Ensuite, la seule question était de savoir comment utiliser ma définition personnalisée au lieu de l'original.

Je vais utiliser le même exemple de remplacement du stripe-hl-linevisage pour parcourir la solution. Cette face est définie dans le package stripe-buffer.

Voici les étapes:

Étape 1. Définissez le vôtre 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)

Il en résultera que la couleur de premier plan du my/stripe-hl-linevisage sera bleu clair pour les arrière-plans sombres et rouge pour les arrière-plans clairs.

Étape 2. Créez une fonction pour remapper le visage

La face-remap-add-relativefonction est utilisée pour remapper un visage existant sur un nouveau visage. Dans ce cas, je remappe le stripe-hl-linevisage my/stripe-hl-line.

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

Étape 3. Faites le remappage à l'emplacement approprié

De la stripe-buffersource, je vois que le hl-linevisage est remappé en stripe-hl-lineface. Nous devons donc faire notre remappage après que le remappage se produise (ce qui est dans la stripe-listify-bufferdéfinition de la fonction).

Nous faisons donc notre remappage en conseillant d' stripe-listify-bufferutiliser le combinateur.:after advice

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

Terminé!

Cela dit, il aurait été génial d'utiliser directement quelque chose comme set-face-attributepour définir des visages en fonction de l'obscurité de l'arrière-plan.

Kaushal Modi
la source