hl-line-mode hide background, ¿cómo evitar esto?

10

Con:

(when window-system
  (set-face-background 'hl-line "light yellow")
  (global-hl-line-mode 1))

línea actual resaltada con fondo amarillo, pero si el texto tiene propiedades de fondo también se sobrescribe (como el modo diff, el modo arcoíris).

¿Es posible establecer el fondo solo para las partes que no tienen propiedades apropiadas?

ACTUALIZACIÓN Comienzo a experimentar, parece que stipple no está en conflicto con el fondo:

(set-face-stipple 'hl-line '(4 4 "\x01\x00\x00\x00"))
(set-face-attribute 'hl-line nil :inherit nil)

Pero, por desgracia, stipple daña la apariencia del texto ...

gavenkoa
fuente
1
Otra posibilidad que quizás desee considerar es una función de eliminación ubicada en el extremo posterior de cada bucle de comando de la línea hl, de modo que se realice una búsqueda desde el principio de la línea actual hasta el final de la línea actual (o al final de la línea visual actual, si corresponde) y la cara de superposición de la línea hl se pueden eliminar de donde exista otro texto con un color de fondo diferente. Es probable que esté buscando resaltado colocado por el bloqueo de fuente, aunque también puede tener resaltado colocado con otras superposiciones (por ejemplo, errores de flyspell / duplicados).
leyes 01 de
@lawlist Estoy interesado en su implementación; ¿Puedes agregar la solución completa a continuación?
Kaushal Modi
@kaushalmodi: sé cómo hacer esto para superposiciones específicas o texto sin formato en el punto, pero no para propiedades específicas de texto / resaltado de bloqueo de fuente en el punto. Debido a que necesitaría investigar cómo evaluar esas dos últimas ocurrencias para responder adecuadamente a esta pregunta, decidí hacer un comentario en su lugar. Aquí hay un fragmento [prestado de una de las bibliotecas de Drew] para probar superposiciones específicas en el punto: (when (memq NAME-OF-FACE (mapcar (function (lambda (ovr) (overlay-get ovr 'face))) (overlays-at (point)))) (remove-overlays BEGINNING-POINT ENDING-POINT 'face hl-line))
leyes el

Respuestas:

5

El problema es que a veces la propiedad de texto facese usa para resaltar y hl-line-modeusa una superposición. Y las superposiciones siempre aparecen "encima de" faceresaltado de propiedades de texto .

diff-mode, por ejemplo, usa la propiedad de texto, no una superposición. Entonces, para casos como este, no tienes suerte.

Pero para resaltar que es producido por una superposición, simplemente puede reducir la prioridad de superposición de la superposición de línea hl: hl-line-overlayo bien global-hl-line-overlay, para que esa superposición parezca estar "debajo" del otro resaltado de superposición.

Si usa la biblioteca hl-line+.el, puede usar la opción hl-line-overlay-prioritypara establecer la prioridad de superposición. Vea también la página Wiki de Emacs Resalte la línea actual . (Pero nuevamente, cambiar la prioridad de la superposición no tiene efecto si el otro resaltado no es de una superposición).

Dibujó
fuente
Gracias por responder. No me preocupo por la diferencia entre caras y superposiciones ... +1
gavenkoa
¿Cómo accedo a esa hl-line-overlaypropiedad? Por ejemplo, no aparece en customize-variable.
9000
@ 9000: como dice la respuesta, si usa la biblioteca hl-line+.el, simplemente personaliza la opción hl-line-overlay-priority. De lo contrario, no puede (excepto redefiniendo o asesorando las funciones proporcionadas previamente). Ese es el punto de proporcionar esta opción de usuario.
Dibujó el
3

Termino con una solución parcial: resalte solo desde el final de la línea:

(defun my-hl-line-range-function ()
  (cons (line-end-position) (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

(when window-system
  (require 'hl-line)
  (set-face-attribute 'hl-line nil :inherit nil :background "light yellow")
  (setq global-hl-line-sticky-flag t)
  (global-hl-line-mode 1))
gavenkoa
fuente
2

Tropecé con esta pregunta al intentar no hl-lineanular el fondo (aunque en este caso se trataba de guías de sangría):

Me decidí por esto, que comienza a dibujar la línea resaltada después de la sangría:

(defun my-hl-line-range-function ()
  (cons
   (+ (line-beginning-position 1) (current-indentation))
   (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

Reemplazar (+ (line-beginning-position 1) (current-indentation))con (point)trabajos también, (comenzando en el cursor).

ideasman42
fuente