Para que servem as sobreposições e como elas diferem das propriedades do texto?

23

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.?

Sébastien Le Callonnec
fonte
Leia mais dessa seção do manual do que apenas uma frase. É bem explicado, IMO. Incluindo diferenças das propriedades do texto. Veja também (no mesmo manual) i text properties, é claro.
Drew

Respostas:

10

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-stringpropriedade 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.

Malabarba
fonte
12

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:

  • Você pode definir propriedades de texto em cadeias que não fazem parte de nenhum buffer, enquanto você sempre precisa de um buffer para sobreposições.
  • Você não pode manter uma lista de propriedades de texto adicionadas em algum lugar, embora seja fácil manter uma lista de sobreposições adicionadas a um buffer e, por exemplo, excluir todas as sobreposições de uma só vez.
  • Você pode ter uma única sobreposição que define várias sobreposições em um texto (por exemplo, uma face, uma dica de ferramenta e um ícone de franja), para poder usar uma sobreposição para gerenciar um "grupo" de propriedades como uma única unidade, enquanto não há tal coisa para propriedades de texto. Você os define individualmente e os gerencia individualmente.

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 customizebuffer. 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.

lunaryorn
fonte