窗口位置中的临时文本,没有要修饰/覆盖的文本?


9

问:如何在屏幕位置的窗口中临时显示文本,而没有文本以显示/叠加?

我熟悉文本属性覆盖背后的基本概念(另请参见本主题),已经使用了几次,但绝不熟练。我有限的理解是,需要文本来进行调整或覆盖,但是我想知道如何使用窗口中没有任何文本的部分。

这是示例的屏幕截图:

在此处输入图片说明

如何将文本临时(临时)放在屏幕快照的红色框中,即文本右边或缓冲区最后一行下方的空白处?


简而言之,可以使用display属性显示不存在的文本。在我回家之前,有人可能会给出完整的答案。
马拉巴巴

company-mode通过在display属性之前和之后的位置上放置足够的文字来完成覆盖,或者使用after-string属性在缓冲区末尾显示内容。我不太确定在侧面显示什么,但是似乎可以使用正确的覆盖层宽度和位置。
wasamasa 2014年

您不仅可以发insert短信到缓冲区并对其进行调整吗?
rekado 2014年

Answers:


6

我整理了一个函数的工作示例,该函数接受一个字符串,并在缓冲区文本之后在超时的情况下临时显示它:

(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")

您可以更加疯狂,添加面孔以区分这些叠加层与缓冲区文本,显示它们的时间长于超时时间,调整它们的位置,检测何时没有空白空间,并使用经过规范化处理的文本的正常叠加层,等等。公司模式的源代码, 因为它非常易读,并且演示了对叠加层的更精细(且几乎没有错误)的使用,以创建具有建议功能的灵活弹出菜单。


2

您可以使用函数在缓冲区中临时显示文本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位置的叠加层上放置该属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.