Я зібрав робочий приклад функції, яка бере рядок і тимчасово відображає її з таймаутом після тексту буфера:
(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)))
Наступний заклик призведе до прикладу нижнього червоного поля:
(my-momentarily-display-after-buffer-end "Nothing to see here...")
Причина цього працює в тому, що накладки використовують маркери як позиції для відображення між ними. Використання самого зовнішнього положення як початку та кінця накладення дозволяє відображати текст після нього за допомогою after-string
властивості. Оскільки накладки можуть містити вдосконалений текст, я встановив його з відступом та з пробілом навколо нього.
Інший приклад може використовувати ту саму ідею для відображення тексту після закінчення рядка:
(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)))
Наступний виклик призведе до прикладу червоного поля правого боку:
(my-momentarily-display-after-line-end "annotation")
Ви можете піти набагато божевільніше і додати обличчя, щоб відрізнити ці накладки від буферного тексту, відобразити їх довше, ніж за тайм-аут, відрегулювати їх положення, виявити, коли немає порожнього простору, і використовувати звичайні накладки з належного тексту тощо. Я рекомендую переглянути вихідний код
фірмового режиму, оскільки він дуже читабельний і демонструє більш детальне (і в основному помилка) використання накладок для створення гнучкого спливаючого меню з запропонованими функціями.