Ich möchte set-face-attribute
eine von zwei Farben für den Vordergrund auswählen, je nachdem, ob der Hintergrund des aktuellen Themas hell oder dunkel ist.
Das erwartete Verhalten ist, dass sich der Vordergrund automatisch ändert, wenn ich von einem hellen Hintergrundthema zu einem dunklen Hintergrundthema wechsle oder umgekehrt.
Hier ist ein Anwendungsfall:
Ich passe das Gesicht stripe-hl-line
wie folgt an:
(set-face-attribute 'stripe-hl-line nil
:overline "gray"
:underline "gray"
:foreground "dodger blue")
Aber ich möchte den Vordergrund ändern, je nachdem, ob das Thema hell oder dunkel ist. Auf diese Weise muss ich mich nicht darum kümmern, dieses Gesicht in jedem Thema anzupassen.
color
Bibliothek hier nutzen. Sie könnten wahrscheinlich den RGB- oder Hex-Wert der Hintergrundfläche erhalten, einen Schwellenwert für "Dunkel" bestimmen und den Vordergrund entsprechend einstellen.Antworten:
Dank @MadhavanKumar habe ich mich darauf konzentriert, eine Lösung basierend auf abzuleiten
defface
.Mir wurde klar, dass ich ein vorhandenes nicht überschreiben
defface
kann, aber ich kann immer meinen eigenen Hintergrund farbempfindlich erstellendefface
. Dann war die einzige Frage, wie ich mein benutzerdefiniertes Defface anstelle des Originals verwenden sollte.Ich werde das gleiche Beispiel für das Überschreiben des
stripe-hl-line
Gesichts verwenden, um durch die Lösung zu gehen. Dieses Gesicht ist im Paket definiertstripe-buffer
.Hier sind die Schritte:
Schritt 1. Definieren Sie Ihre eigenen
defface
Dies führt dazu, dass die Vordergrundfarbe des
my/stripe-hl-line
Gesichts für dunkle Hintergründe dodgerblau und für helle Hintergründe rot ist .Schritt 2. Erstellen Sie eine Funktion, um das Gesicht neu zuzuordnen
Die
face-remap-add-relative
Funktion wird verwendet, um ein vorhandenes Gesicht einem neuen Gesicht zuzuordnen. In diesem Fall ordne ich dasstripe-hl-line
Gesicht neu zumy/stripe-hl-line
.Schritt 3. Führen Sie die Neuzuordnung an der entsprechenden Stelle durch
Aus der
stripe-buffer
Quelle sehe ich, dass dashl-line
Gesicht dem Gesicht neu zugeordnet wirdstripe-hl-line
. Wir müssen also unsere Neuzuordnung durchführen, nachdem diese Neuzuordnung erfolgt ist (was in derstripe-listify-buffer
Funktionsdefinition enthalten ist).Deshalb machen wir unsere Neuzuordnung, indem wir die
stripe-listify-buffer
Verwendung des Kombinators empfehlen .:after
advice
Getan!
Trotzdem wäre es fantastisch gewesen, so etwas direkt zu verwenden
set-face-attribute
, um Gesichter basierend auf der Dunkelheit im Hintergrund festzulegen.quelle