Me gustaría utilizar set-face-attributepara elegir uno de los dos colores para el primer plano dependiendo de si el fondo del tema actual es claro u oscuro.
El comportamiento esperado es que el primer plano cambia automáticamente si cambio de un tema de fondo claro a un tema de fondo oscuro o viceversa.
Aquí hay un caso de uso:
Personalizo la cara de la stripe-hl-linesiguiente manera:
(set-face-attribute 'stripe-hl-line nil
:overline "gray"
:underline "gray"
:foreground "dodger blue")
Pero me gustaría cambiar el primer plano en función de si el tema es claro u oscuro. De esa manera no tengo que preocuparme por personalizar esa cara en cada tema.

colorbiblioteca aquí. Probablemente podría obtener el valor rgb o hexadecimal de la cara de fondo, determinar un valor umbral para "oscuro" y establecer el primer plano en consecuencia.Respuestas:
Gracias a @MadhavanKumar, me centré en derivar una solución basada en
defface.Me di cuenta de que no puedo anular una existente,
deffacepero siempre puedo crear mi propio color de fondo sensibledefface. Entonces, la única pregunta era cómo usar mi defface personalizada en lugar de la original.Usaré el mismo ejemplo de anular la
stripe-hl-linecara para analizar la solución. Esta cara se define en el paquetestripe-buffer.Aquí están los pasos:
Paso 1. Define tu propio
deffaceEsto dará como resultado que el color de primer plano de la
my/stripe-hl-linecara sea azul para fondos oscuros y rojo para fondos claros.Paso 2. Crea una función para reasignar la cara
La
face-remap-add-relativefunción se utiliza para reasignar una cara existente a una nueva cara. En este caso, estoy reasignando lastripe-hl-linecara amy/stripe-hl-line.Paso 3. Haz la reasignación en la ubicación adecuada
Desde la
stripe-bufferfuente, veo que lahl-linecara se reasigna a lastripe-hl-linecara. Entonces necesitamos hacer nuestra reasignación después de que ocurra esa reasignación (que está en lastripe-listify-bufferdefinición de la función).Entonces hacemos nuestra reasignación aconsejando
stripe-listify-bufferusar el combinador.:afteradvice¡Hecho!
Dicho esto, hubiera sido increíble usar directamente algo como
set-face-attributeponer caras basadas en la oscuridad del fondo.fuente