O manual declara:
Você pode usar sobreposições para alterar a aparência do texto de um buffer na tela, para fins de apresentação.
Pelo nome, ele sugere que ele pode ser usado para criar "camadas" sobre o texto existente, mas a descrição acima parece indicar que altera a aparência do texto, que se parece muito com o que as propriedades do texto fazem.
O que é um uso concreto de sobreposições? O que eles oferecem que as propriedades de texto não oferecem? Eles podem ser usados para escrever texto sobre texto em um buffer, como um pop-up, uma caixa de informações etc.?
text-properties
overlays
Sébastien Le Callonnec
fonte
fonte
i text properties
, é claro.Respostas:
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.
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.
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.
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.
fonte
Sobreposições e propriedades de texto têm exatamente os mesmos recursos. Eles adicionam margens de alteração, botões, faces, ícones de franjas, dicas de ferramentas, imagens, realces etc. a uma parte específica do texto. No entanto, há uma enorme diferença conceitual:
As sobreposições são independentes , as propriedades de texto não. O Emacs tem um tipo de sobreposição distinto , mas não há "tipo de propriedade de texto". As propriedades do texto estão inerentemente vinculadas à sequência em que foram definidas. As sobreposições, por outro lado, são anexadas a um buffer.
Existem algumas implicações práticas dessa diferença:
A essência de tudo isso é que você pode gerenciar sobreposições separadamente do conteúdo do texto. Conceitualmente, você os usaria para itens que mostraria no buffer, mesmo que seja independente do texto.
Na prática, você usaria sobreposições se as coisas que você gostaria de adicionar ao texto mudarem com frequência, enquanto usaria propriedades de texto se as coisas fossem constantes.
Por exemplo, o Emacs usa propriedades de texto para criar os botões e inserir widgets em um
M-x customize
buffer. Esses widgets são criados uma vez e permanecem lá enquanto o buffer estiver ativo, portanto, não há necessidade de trazer sobreposições.No entanto, o Flycheck usa sobreposições para destacar erros no buffer, porque frequentemente precisa remover e adicionar destaques.
fonte