Agregar cuadro alrededor del texto sin cambiar el ancho del texto

9

La documentación de Face Attributes sugiere que agregar un line-widthde -nal atributo box

dibuje una línea de ancho n cuyas partes superior e inferior ocupen el espacio del texto subyacente, evitando así cualquier aumento en la altura de los caracteres.

Así que agregué la siguiente línea a mi archivo de tema personal para los candidatos de isearch ( lazy-highlight):

`(lazy-highlight ((,class (:box (:line-width -1 :color ,search) :background ,bg1 :foreground ,fg1))))

Esto funciona bien teniendo en cuenta la altura, sin embargo, el ancho del texto cambia como se ve en el gif a continuación:

ingrese la descripción de la imagen aquí

¿Hay alguna forma de hacer que la parte izquierda y derecha del cuadro también ocupe el texto subyacente para que no haya cambios en el ancho del texto?

Pouya
fuente
¿Las columnas permanecen alineadas si resaltas todo?
Melioratus
@Melioratus, sí, el ancho agregado es uniforme y constante.
Pouya

Respuestas:

3

Mi caso de uso para este SE es tener un cuadro alrededor de la regioncara, por lo que la región resaltada en transient-mark-modees visible incluso cuando la región se superpone con algunas otras superposiciones:

(set-face-attribute 'region nil
                    :box '(:line-width -1
                           :color "gtk_selection_bg_color"
                           :style nil))

Por ejemplo, con iedit-mode:

superposición de región en caja superpuesta con superposición de iedit

Cada vez que el texto se resalta con "región encuadrada" puedo ver el ancho del texto descrito parpadeando.

El truco sucio que pude encontrar para eliminar este parpadeo es agregar un cuadro con el color de fondo a la defaultcara. Desafortunadamente, este truco introduciría una serie de problemas en otros lugares, como un espacio adicional entre líneas o la representación incorrecta de los widgets de botones (por ejemplo, en los buffers de personalización).

La solución final se da en el siguiente informe de error (vea el parche adjunto al final del hilo):

Texto que mueve el cursor en movimiento con el cuadro alrededor del texto habilitado

Esta solución afecta a los componentes internos de Emacs y requiere una compilación personalizada de Emacs después de aplicar el parche.

Voy a probar la solución posterior pronto. Sin embargo, el problema es que mi init.elsería incompatible con las compilaciones de Emacs de stock y tendrá que usar alguna lógica adicional para encontrar si se aplica el parche anterior.

Con suerte, después de algunas pruebas, este parche sería aceptado en la fuente de Emacs ...

2019-01-21 seguimiento:

Parece que el parche mencionado anteriormente no es compatible con el último código fuente de Emacs. Tuve que hacer algunos cambios para que funcione con la rama maestra actual de Emacs git. En lugar de crear otro parche, hice un tenedor en github y creé una rama aguas arriba con el parche de la caja de la cara:

cara-caja-parche

Construir Emacs desde esta rama es lo mismo que las compilaciones de Emacs.

El siguiente es el init.elcódigo que debe ser compatible con las versiones Emacs parcheadas y vainilla:

(unwind-protect
    (condition-case ex
        (set-face-attribute
         'region nil
         :box '(:line-width (-1 . -1)
                            :color "gtk_selection_bg_color"
                            :style nil))
      ('error
       (set-face-attribute
        'region nil
        :box '(:line-width -1
                           :color "gtk_selection_bg_color"
                           :style nil)))))

Solo se prueba en Linux con GTK +

Victor Rybynok
fuente
Buen hallazgo! Parece que el parche fue hace un año, así que no tengo esperanzas de que sea aceptado.
amitp
Apliqué el parche y ahora estoy usando un ancho de caja negativo :-) ¡Gracias!
amitp
@amitp ¡Gracias por confirmar que el parche de Alexandre ha funcionado para ti! ¿Qué versión, sistema operativo y GUI de Emacs estás usando?
Victor Rybynok
Estoy usando la versión GUI del "Puerto Mac" . Emacs 26.1.91. Después de aplicar el parche, tuve que cambiar un archivo específico de Mac (macterm.c) para hacer los mismos cambios que en el resto del código. Sin embargo, creo que el parche hace mucho más de lo que realmente quiero. Creo (pero no lo he probado) que debería ser capaz de cambiar eabs (s->face->box_line_width)a max (s->face->box_line_width, 0)y ningún otro cambio.
amitp
Después de usarlo por un día, veo pequeños problemas técnicos. No sé si son por el parche o por mis cambios en macterm.c. En cualquier caso, terminé volviendo.
amitp