¿Para qué son las superposiciones y en qué se diferencian de las propiedades del texto?


23

El manual dice:

Puede usar superposiciones para alterar la apariencia del texto de un búfer en la pantalla, en aras de las características de presentación.

Por su nombre, sugiere que se puede usar para crear "capas" sobre el texto existente, pero la descripción anterior parece indicar que altera la apariencia del texto, que se siente muy similar a lo que hacen las propiedades del texto.

¿Qué es un uso concreto de las superposiciones? ¿Qué ofrecen que no tengan las propiedades de texto? ¿Se pueden usar para escribir texto sobre texto en un búfer, como una ventana emergente, un cuadro de información, etc.?


Lea más de esa sección del manual que solo una oración. Está bastante claramente explicado, OMI. Incluyendo diferencias de las propiedades del texto. Ver también (en el mismo manual) i text properties, por supuesto.
Dibujó el

Respuestas:


10

¿Qué son las superposiciones?

En primer lugar, son objetos elisp. Esto será relevante más adelante.

Como usted mismo dijo, representan capas que se aplican sobre las regiones del búfer. Estas capas tienen propiedades de texto, al igual que el texto real en el búfer. Cualquier propiedad regular que tenga una superposición se aplica al texto debajo de ella. Sin embargo, hay algunas propiedades que son especiales para las superposiciones (no hacen nada si se aplican al texto).

¿Por qué son útiles?

Por las dos razones que indiqué anteriormente:

Son objetos

Esto significa que puede almacenarlos en listas y manejarlos fácilmente. Puede cambiar sus propiedades sin tener que hacer un seguimiento de dónde están en este momento. Aún mejor, puede utilizar ellos para realizar un seguimiento de dónde están las cosas en el búfer.

Esta respuesta de Stefan es un buen ejemplo de superposiciones que se utilizan para realizar un seguimiento de las regiones de almacenamiento intermedio. Aquí hay un pequeño fragmento de él.

(let ((ol (make-overlay beg end)))
  (overlay-put ol 'evaporate t)
  (overlay-put ol 'my--auto-align-regexp regexp)
  (push ol my--auto-align-overlays))

Utiliza superposiciones para registrar qué regiones se van a alinear y qué expresiones regulares usar en cada una de ellas. my--auto-align-overlayses

una lista donde se almacenan las superposiciones, y se puede acceder a ellas de manera conveniente al consultar esta lista.
Por el contrario, si estuviéramos usando propiedades de texto para esto (lo cual es posible) no tendríamos una forma fácil de acceder a ellas. Debe analizar el búfer para buscar propiedades de texto.

Son un poco más poderosos

Hay algunas propiedades de texto que solo tienen efecto en las superposiciones. Puede encontrar la lista completa en el manual . Es demasiado grande para incluirlo aquí, pero aquí hay un breve resumen.

before-string
El valor de esta propiedad es una cadena para agregar a la pantalla al comienzo de la superposición. La cadena no aparece en el búfer en ningún sentido, solo en la pantalla.
prefijo de línea
Esta propiedad especifica una especificación de visualización para anteponer a cada línea de no continuación en tiempo de visualización. Ver truncamiento.
wrap-prefix
Esta propiedad especifica una especificación de visualización para anteponer a cada línea de continuación en tiempo de visualización. Ver truncamiento.

En particular, la before-stringpropiedad le permite afectar la visualización del búfer incluso con una superposición de ancho 0. Que es algo que no puedes hacer con la propiedad de texto. Todo lo que haga con las propiedades de texto debe ir sobre un texto existente (que podría ocultar este texto) o sobre una nueva cadena de texto que inserte (lo que altera el contenido real del búfer).

Aquí hay un fragmento de ejemplo sobre eso. Evaluarlo en un búfer temporal.

(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")

¿Cuándo son malos?

Las superposiciones son mucho más exigentes (procesamiento inteligente) que las propiedades de texto. Algunas operaciones relevantes (como la inserción de texto, si no me equivoco) toman un tiempo proporcional al número de superposiciones en un búfer. Por esa razón, no son adecuados cuando necesita una gran cantidad de ellos. En este caso, debe renunciar a las propiedades de texto.


12

Las superposiciones y las propiedades de texto tienen exactamente las mismas capacidades. Añaden márgenes de cambio, botones, caras, iconos marginales, información sobre herramientas, imágenes, resaltados, etc. a una parte específica del texto. Sin embargo, hay una gran diferencia conceptual:

Las superposiciones son independientes , las propiedades del texto no lo son. Emacs tiene un tipo de superposición distinto , pero no hay un "tipo de propiedad de texto". Las propiedades del texto están inherentemente vinculadas a la cadena en la que se establecieron. Las superposiciones, por otro lado, están unidas a un búfer.

Hay algunas implicaciones prácticas de esta diferencia:

  • Puede establecer propiedades de texto en cadenas que no forman parte de ningún búfer, mientras que siempre necesita un búfer para superposiciones.
  • No puede mantener una lista de propiedades de texto que agregó en alguna parte, mientras que es fácil mantener una lista de superposiciones agregadas a un búfer y, por ejemplo, eliminar todas las superposiciones de una sola vez.
  • Puede tener una sola superposición que establezca varias superposiciones en un texto (por ejemplo, una cara, una información sobre herramientas y un icono de franja), por lo que puede usar una superposición para administrar un "grupo" de propiedades como una sola unidad, mientras que no hay tal cosa para las propiedades de texto. Los configura individualmente y los administra individualmente.

La esencia de todo esto es que puede administrar las superposiciones por separado del contenido del texto. Conceptualmente, los usaría para cosas que mostraría en el búfer, aunque sea independiente del texto.

Prácticamente, usaría superposiciones si las cosas que desea agregar al texto cambian con frecuencia, mientras que usaría propiedades de texto si las cosas son constantes.

Por ejemplo, Emacs usa propiedades de texto para crear los botones y los widgets de entrada en un M-x customizebúfer. Estos widgets se crean una vez y permanecen allí mientras el búfer esté activo, por lo que no es necesario que se superpongan.

Sin embargo, Flycheck usa superposiciones para resaltar errores en el búfer, ya que con frecuencia necesita eliminar y agregar resaltados.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.