Ho preparato un esempio funzionante di una funzione che accetta una stringa e la visualizza temporaneamente con un timeout dopo il testo del buffer:
(defun my-momentarily-display-after-buffer-end (string &optional timeout)
(let ((ov (make-overlay (point-max) (point-max))))
(overlay-put ov 'after-string
(concat (propertize " " 'display
'(space :align-to (+ left-fringe 10)))
(propertize string 'display
'(raise -1))
"\n\n"))
(sit-for (or timeout 5))
(delete-overlay ov)))
Il seguente incantesimo si tradurrà nell'esempio della casella rossa inferiore:
(my-momentarily-display-after-buffer-end "Nothing to see here...")
Il motivo per cui funziona è perché gli overlay utilizzano i marker come posizioni da visualizzare tra. L'uso della posizione più esterna come inizio e fine della sovrapposizione consente di visualizzare il testo dopo di esso utilizzando la after-string
proprietà Poiché gli overlay possono contenere testo corretto, l'ho impostato per apparire rientrato e con spazi bianchi attorno ad esso.
L'altro esempio può utilizzare la stessa idea per visualizzare il testo dopo la fine della riga:
(defun my-momentarily-display-after-line-end (string &optional timeout)
(let ((ov (make-overlay (line-end-position) (line-end-position))))
(overlay-put
ov 'after-string
(concat (propertize " " 'display
`(space :align-to (- right-fringe
,(1+ (length string)))))
string))
(sit-for (or timeout 5))
(delete-overlay ov)))
La seguente chiamata comporterà l'esempio della casella rossa sul lato destro:
(my-momentarily-display-after-line-end "annotation")
Puoi diventare molto più pazzo e aggiungere facce per distinguere questi overlay dal testo del buffer, visualizzarli più a lungo che per un timeout, regolare la loro posizione, rilevare quando non c'è spazio vuoto e utilizzare normali overlay di testo corretto, ecc. Consiglio di guardare il codice sorgente della
modalità azienda perché è molto leggibile e dimostra un uso più elaborato (e per lo più privo di bug) degli overlay per creare un menu popup flessibile con le funzionalità suggerite.