Я подобрал рабочий пример функции, которая берет строку и временно отображает ее с таймаутом после текста буфера:
(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")
Вы можете немного сойти с ума и добавить грани, чтобы отличать эти наложения от текста буфера, отображать их дольше, чем в течение тайм-аута, корректировать их положение, обнаруживать отсутствие пустого пространства и использовать обычные наложения правильного текста и т. Д. Я рекомендую посмотреть на исходный код режима
компании, потому что он очень удобочитаемый и демонстрирует более сложное (и в основном безглючное) использование наложений для создания гибкого всплывающего меню с предлагаемыми функциями.