O que são sobreposições?
Antes de tudo, são objetos elisp. Isso será relevante mais tarde.
Como você mesmo disse, eles representam camadas que se aplicam às regiões do buffer. Essas camadas têm propriedades de texto, assim como o texto real no buffer. Qualquer propriedade regular de uma sobreposição se aplica ao texto abaixo dela. No entanto, existem algumas propriedades especiais para sobreposições (elas não fazem nada se aplicadas no texto).
Por que eles são úteis?
Pelas duas razões que sugeri acima:
Eles são objetos
Isso significa que você pode armazená-los em listas e manipulá-los facilmente. Você pode alterar suas propriedades sem ter que acompanhar onde estão agora. Melhor ainda, você pode usá- los para acompanhar onde as coisas estão no buffer.
Esta resposta de Stefan é um bom exemplo de sobreposições sendo usadas para rastrear regiões de buffer. Aqui está um pequeno trecho dele.
(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))
Ele usa sobreposições para registrar quais regiões devem ser alinhadas e qual regexp usar em cada uma delas. my--auto-align-overlays
é
uma lista em que as sobreposições estão armazenadas e elas podem ser acessadas de maneira conveniente, consultando essa lista.
Por outro lado, se estivéssemos usando propriedades de texto para isso (o que é possível), não teríamos uma maneira fácil de acessá-las. Você precisa analisar o buffer para encontrar propriedades de texto.
Eles são um pouco mais poderosos
Existem algumas propriedades de texto que afetam apenas as sobreposições. Você pode encontrar a lista completa
no manual . É muito grande para ser incluído aqui, mas aqui está um breve destaque.
before-string
O valor dessa propriedade é uma string a ser adicionada à exibição no início da sobreposição. A string não aparece no buffer em nenhum sentido - apenas na tela.
prefixo de linha
Esta propriedade especifica uma especificação de exibição a ser anexada a cada linha de não continuação no momento da exibição. Consulte Truncamento.
wrap-prefix
Esta propriedade especifica uma especificação de exibição a ser anexada a cada linha de continuação no momento da exibição. Consulte Truncamento.
Em particular, a before-string
propriedade permite afetar a exibição do buffer, mesmo com uma sobreposição de largura 0. O que é algo que você não pode fazer com a propriedade de texto. Tudo o que você faz com propriedades de texto precisa passar por cima de um texto existente (que pode ocultar esse texto) ou passar por uma nova sequência de texto inserida (que altera o conteúdo real do buffer).
Aqui está um trecho de exemplo sobre isso. Avalie-o em um buffer temporário.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
Quando eles são ruins?
As sobreposições são muito mais exigentes (processamento) do que as propriedades do texto. Algumas operações relevantes (como inserção de texto, se não me engano) levam um tempo proporcional ao número de sobreposições em um buffer. Por esse motivo, eles não são adequados quando você precisa de um grande número deles. Nesse caso, você deve renunciar às propriedades do texto.
i text properties
, é claro.