A cosa servono gli overlay e in che modo differiscono dalle proprietà del testo?


23

Il manuale afferma:

È possibile utilizzare le sovrapposizioni per modificare l'aspetto del testo di un buffer sullo schermo, per motivi di funzionalità di presentazione.

Dal suo nome, suggerisce che può essere utilizzato per creare "livelli" sul testo esistente, ma la descrizione sopra sembra indicare che altera l'aspetto del testo, che sembra molto simile a quello che fanno le proprietà del testo.

Qual è un uso concreto degli overlay? Cosa offrono che le proprietà del testo non fanno? Possono essere usati per scrivere testo su testo in un buffer, come un popup, una finestra informativa, ecc.?


Leggi più di quella sezione manuale di una sola frase. È abbastanza chiaramente spiegato, IMO. Comprese le differenze rispetto alle proprietà del testo. Vedi anche (nello stesso manuale) i text properties, ovviamente.
Disegnò il

Risposte:


10

Cosa sono gli overlay?

Prima di tutto, sono oggetti elisp. Questo sarà rilevante in seguito.

Come hai detto tu stesso, rappresentano i livelli che si applicano in cima alle aree del buffer. Questi livelli hanno proprietà di testo, proprio come il testo effettivo nel buffer. Qualsiasi proprietà regolare che ha una sovrapposizione, si applica al testo sottostante. Tuttavia, ci sono alcune proprietà speciali degli overlay (che non fanno nulla se applicati al testo).

Perché sono utili?

Per i due motivi che ho accennato sopra:

Sono oggetti

Ciò significa che è possibile memorizzarli in elenchi e gestirli facilmente. Puoi modificare le loro proprietà senza dover tenere traccia di dove si trovano adesso. Ancora meglio, puoi usarli per tenere traccia di dove sono le cose nel buffer.

Questa risposta di Stefan è un buon esempio di sovrapposizioni utilizzate per tenere traccia delle aree di buffer. Ecco un breve frammento di esso.

(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))

Utilizza le sovrapposizioni per registrare quali regioni devono essere allineate e quali regexp utilizzare su ciascuna di esse. my--auto-align-overlaysè

un elenco in cui sono archiviati gli overlay, a cui è possibile accedere comodamente consultando l'elenco.
Al contrario, se usassimo le proprietà del testo per questo (che è possibile) non avremmo un modo semplice per accedervi. È necessario analizzare il buffer per trovare le proprietà del testo.

Sono leggermente più potenti

Ci sono alcune proprietà di testo che hanno effetto solo sulle sovrapposizioni. Puoi trovare l'intero elenco nel manuale . È troppo grande per essere incluso qui, ma ecco un breve highlight.

before-string
Il valore di questa proprietà è una stringa da aggiungere alla visualizzazione all'inizio della sovrapposizione. La stringa non appare nel buffer in alcun senso, solo sullo schermo.
prefisso riga
Questa proprietà specifica una specifica di visualizzazione da anteporre a ciascuna riga di non continuazione al momento della visualizzazione. Vedi Troncamento.
wrap-prefix
Questa proprietà specifica una specifica di visualizzazione da anteporre a ciascuna linea di continuazione al momento della visualizzazione. Vedi Troncamento.

In particolare, la before-stringproprietà consente di influire sulla visualizzazione del buffer anche con una sovrapposizione di larghezza 0. Che è qualcosa che non puoi fare con la proprietà text. Tutto ciò che fai con le proprietà del testo deve andare su un testo esistente (che potrebbe nascondere questo testo) o su una nuova stringa di testo che inserisci (che altera il contenuto reale del buffer).

Ecco un esempio di frammento a riguardo. Valutalo su un buffer temporaneo.

(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")

Quando sono cattivi?

Le sovrapposizioni sono molto più impegnative (elaborazione saggia) rispetto alle proprietà del testo. Alcune operazioni rilevanti (come l'inserimento di testo, se non sbaglio) richiedono un tempo proporzionale al numero di overlay in un buffer. Per questo motivo, non sono adatti quando ne hai bisogno in gran numero. In questo caso dovresti dimettersi dalle proprietà del testo.


12

Le sovrapposizioni e le proprietà del testo hanno esattamente le stesse capacità. Aggiungono margini di modifica, pulsanti, facce, icone di frange, descrizioni comandi, immagini, luci, ecc. A una parte specifica del testo. Tuttavia, c'è un'enorme differenza concettuale:

Le sovrapposizioni sono indipendenti , le proprietà del testo no. Emacs ha un tipo di overlay distinto , ma non esiste un "tipo di proprietà del testo". Le proprietà del testo sono intrinsecamente legate alla stringa su cui sono state impostate. Le sovrapposizioni invece sono collegate a un buffer.

Ci sono alcune implicazioni pratiche di questa differenza:

  • È possibile impostare le proprietà del testo su stringhe che non fanno parte di alcun buffer, mentre è sempre necessario un buffer per le sovrapposizioni.
  • Non è possibile mantenere un elenco di proprietà del testo aggiunte da qualche parte, mentre è facile mantenere un elenco di overlay aggiunti a un buffer e, ad esempio, eliminare tutti gli overlay in una volta sola.
  • Puoi avere un singolo overlay che imposta più overlay su un testo (ad es. Una faccia, una descrizione comandi e un'icona a margine), quindi puoi utilizzare un overlay per gestire un "gruppo" di proprietà come una singola unità, mentre non esiste tale cosa per le proprietà del testo. Li imposta individualmente e li gestisci individualmente.

L'essenza di tutto ciò è che puoi gestire gli overlay separatamente dal contenuto del testo. Concettualmente li useresti per cose che mostreresti nel buffer, anche se è indipendente dal testo.

In pratica, useresti le sovrapposizioni se le cose che desideri aggiungere al testo cambiano frequentemente, mentre useresti le proprietà del testo se le cose sono costanti.

Ad esempio, Emacs utilizza le proprietà del testo per creare i pulsanti e inserire i widget in un M-x customizebuffer. Questi widget vengono creati una volta e rimangono lì finché il buffer è attivo, quindi non è necessario introdurre sovrapposizioni.

Tuttavia, Flycheck utilizza gli overlay per evidenziare gli errori nel buffer, poiché spesso deve rimuovere e aggiungere punti salienti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.