¿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-overlays
es
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-string
propiedad 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.
i text properties
, por supuesto.