问:如何在屏幕位置的窗口中临时显示文本,而没有文本以显示/叠加?
我熟悉文本属性和覆盖背后的基本概念(另请参见本主题),已经使用了几次,但绝不熟练。我有限的理解是,需要文本来进行调整或覆盖,但是我想知道如何使用窗口中没有任何文本的部分。
这是示例的屏幕截图:
如何将文本临时(临时)放在屏幕快照的红色框中,即文本右边或缓冲区最后一行下方的空白处?
insert
短信到缓冲区并对其进行调整吗?
问:如何在屏幕位置的窗口中临时显示文本,而没有文本以显示/叠加?
我熟悉文本属性和覆盖背后的基本概念(另请参见本主题),已经使用了几次,但绝不熟练。我有限的理解是,需要文本来进行调整或覆盖,但是我想知道如何使用窗口中没有任何文本的部分。
这是示例的屏幕截图:
如何将文本临时(临时)放在屏幕快照的红色框中,即文本右边或缓冲区最后一行下方的空白处?
insert
短信到缓冲区并对其进行调整吗?
Answers:
我整理了一个函数的工作示例,该函数接受一个字符串,并在缓冲区文本之后在超时的情况下临时显示它:
(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")
您可以更加疯狂,添加面孔以区分这些叠加层与缓冲区文本,显示它们的时间长于超时时间,调整它们的位置,检测何时没有空白空间,并使用经过规范化处理的文本的正常叠加层,等等。公司模式的源代码, 因为它非常易读,并且演示了对叠加层的更精细(且几乎没有错误)的使用,以创建具有建议功能的灵活弹出菜单。
您可以使用函数在缓冲区中临时显示文本momentary-string-display
。它需要显示一条消息和缓冲区中的位置。
这个:
(momentary-string-display "hello there" 200)
会将字符串“ hello there”放置在缓冲区中的200位置。它将把所有其他文本移到一边,以便为“ hello world”腾出空间,但是所有内容将恢复到您按任意键时的位置。
您不需要缓冲区中的文本来创建覆盖,尽管这是文本属性的要求。这是宽度为零的覆盖层,会导致显示其他文本:
(let ((ov (make-overlay 1 1)))
(overlay-put ov 'before-string "this text is not part of the buffer"))
请注意,此叠加层将推开缓冲区文本;它不会覆盖给定位置的文本。
似乎不可能在缓冲区中大于point-max
/的任何位置放置叠加层buffer-size
,即,除非您不遵守此限制,否则可能无法将文本放置在缓冲区文本下方的某些特定位置。当然,您可以将文本放置在缓冲区文本之后,并在after-string
固定到该point-max
位置的叠加层上放置该属性。