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-string
proprietà 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.
i text properties
, ovviamente.