J'ai concocté un exemple de travail d'une fonction qui prend une chaîne et l'affiche temporairement avec un délai d'attente après le texte du tampon:
(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)))
L'incantation suivante se traduira par votre exemple de boîte rouge inférieure:
(my-momentarily-display-after-buffer-end "Nothing to see here...")
La raison pour laquelle cela fonctionne est que les superpositions utilisent des marqueurs comme positions à afficher entre. L'utilisation de la position la plus à l'extérieur comme début et fin de la superposition vous permet d'afficher du texte après celle-ci à l'aide de la after-string
propriété. Étant donné que les superpositions peuvent contenir du texte personnalisé, je l'ai configuré pour apparaître en retrait et avec des espaces autour.
L'autre exemple peut utiliser la même idée pour afficher du texte après la fin de la ligne:
(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)))
L'invocation suivante se traduira par votre exemple de boîte rouge à droite:
(my-momentarily-display-after-line-end "annotation")
Vous pouvez devenir beaucoup plus fou et ajouter des visages pour distinguer ces superpositions du texte tampon, les afficher plus longtemps que pour un délai d'expiration, ajuster leur position, détecter s'il n'y a pas d'espace vide et utiliser des superpositions normales de texte adapté, etc. Je recommande de regarder le code source du
mode entreprise car il est très lisible et démontre une utilisation plus élaborée (et surtout sans bug) des superpositions pour créer un menu contextuel flexible avec les fonctionnalités suggérées.