Eu criei um exemplo de trabalho de uma função que pega uma string e a exibe temporariamente com um tempo limite após o texto do 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)))
O encantamento a seguir resultará no seu exemplo inferior da caixa vermelha:
(my-momentarily-display-after-buffer-end "Nothing to see here...")
A razão pela qual isso funciona é porque as sobreposições usam marcadores como posições a serem exibidas entre elas. O uso da posição mais externa como início e fim da sobreposição permite exibir o texto após ele usando a after-string
propriedade Como as sobreposições podem conter texto protegido, eu o configurei para aparecer recuado e com espaço em branco ao redor.
O outro exemplo pode usar a mesma idéia para exibir texto após o final da linha:
(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)))
A chamada a seguir resultará no exemplo da caixa vermelha do lado direito:
(my-momentarily-display-after-line-end "annotation")
Você pode ficar muito mais louco e adicionar rostos para distinguir essas sobreposições do texto do buffer, exibi-las por mais tempo, ajustar sua posição, detectar quando não há espaço vazio e usar sobreposições normais de texto apropriado, etc. o código-fonte do
modo empresa, porque é muito legível e demonstra um uso mais elaborado (e principalmente livre de erros) de sobreposições para criar um menu pop-up flexível com os recursos sugeridos.