文字列を受け取り、一時的にバッファテキストの後にタイムアウトで表示する関数の実際の例をホイップしました。
(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")
もっとクレイジーになって、これらのオーバーレイをバッファテキストと区別するために面を追加し、タイムアウトよりも長く表示し、それらの位置を調整し、空きスペースがないことを検出し、プロパティ化されたテキストの通常のオーバーレイを使用するなどできます。company-modeのソースコードは
非常に読みやすく、推奨される機能を備えた柔軟なポップアップメニューを作成するためのオーバーレイのより複雑な(そしてほとんどバグのない)使用方法を示しています。