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.?
text-properties
overlays
Sébastien Le Callonnec
fuente
fuente
i text properties
, por supuesto.Respuestas:
¿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.
Utiliza superposiciones para registrar qué regiones se van a alinear y qué expresiones regulares usar en cada una de ellas.
my--auto-align-overlays
esuna 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.
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.
¿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.
fuente
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:
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 customize
bú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.
fuente