在手动状态:
为了呈现功能,您可以使用覆盖来更改缓冲区文本在屏幕上的外观。
从名称上看,它暗示可以用来在现有文本上创建“图层”,但是上面的描述似乎表明它改变了文本的外观,感觉与文本属性非常相似。
覆盖层的具体用途是什么?他们提供哪些文本属性不提供的功能?可以使用它们在缓冲区(如弹出窗口,信息框等)中的文本上写文本吗?
在手动状态:
为了呈现功能,您可以使用覆盖来更改缓冲区文本在屏幕上的外观。
从名称上看,它暗示可以用来在现有文本上创建“图层”,但是上面的描述似乎表明它改变了文本的外观,感觉与文本属性非常相似。
覆盖层的具体用途是什么?他们提供哪些文本属性不提供的功能?可以使用它们在缓冲区(如弹出窗口,信息框等)中的文本上写文本吗?
Answers:
首先,它们是简单的对象。这将在后面讨论。
就像您自己说的那样,它们代表应用于缓冲区区域顶部的图层。这些层具有文本属性,就像缓冲区中的实际文本一样。叠加层具有的任何常规属性都将应用于其下方的文本。但是,有一些叠加层特有的属性(如果应用于文本,它们不会执行任何操作)。
基于以上两个原因,我暗示了:
这意味着您可以将它们存储在列表中并轻松处理它们。您可以更改它们的属性,而不必跟踪它们现在的位置。更好的是,您可以使用它们来跟踪缓冲区中的内容。
Stefan的这个答案是一个用于跟踪缓冲区的叠加的好例子。这是它的一小段。
(let ((ol (make-overlay beg end)))
(overlay-put ol 'evaporate t)
(overlay-put ol 'my--auto-align-regexp regexp)
(push ol my--auto-align-overlays))
它使用覆盖来记录要对齐的区域,以及在每个区域上要使用的正则表达式。my--auto-align-overlays
是
叠加层的存储列表,通过浏览此列表可以方便地访问它们。
相反,如果我们为此使用文本属性(可能的话),则没有简单的方法来访问它们。您需要解析缓冲区以查找文本属性。
有一些文本属性仅对叠加层有影响。您可以在手册中找到整个列表 。它太大了,无法在此处包含,但这是一小段重点。
before-string
此属性的值是一个字符串,该字符串要添加到叠加层开头的显示中。字符串从任何意义上都不会出现在缓冲区中,仅显示在屏幕上。
line-prefix
此属性指定显示规范,以在显示时在每个非连续行之前。请参阅截断。
wrap-prefix
此属性指定显示规范,该规范在显示时在每个续行之前。请参阅截断。
特别是,该before-string
属性使您即使覆盖0宽度也可以影响缓冲区的显示。使用text属性不能做到这一点。使用文本属性进行的所有操作都需要遍历现有文本(可能会隐藏此文本)或遍历您插入的新文本字符串(这会更改缓冲区的实际内容)。
这是关于此的示例片段。在一个临时缓冲区上评估它。
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
覆盖比文本属性要苛刻得多(在处理方面)。一些相关的操作(例如文本插入,如果我没记错的话)所花费的时间与缓冲区中的覆盖层数量成正比。因此,当您需要大量它们时,它们不合适。在这种情况下,您应该辞职到文本属性。
叠加层和文本属性具有完全相同的功能。它们将更改页边距,按钮,面,边缘图标,工具提示,图像,突出显示等添加到文本的特定部分。但是,在概念上存在巨大差异:
叠加是独立的,文本属性不是。Emacs具有独特的覆盖类型,但是没有“文本属性类型”。文本属性固有地与设置它们的字符串相关。另一方面,叠加层会附加到缓冲区。
这种差异有一些实际含义:
所有这些的本质是您可以与文本内容分开管理覆盖。从概念上讲,即使它们与文本无关,也将它们用于缓冲区中显示的内容。
实际上,如果要添加到文本的内容经常更改,则将使用叠加,而如果填充内容是恒定的,则将使用文本属性。
例如,Emacs使用文本属性在M-x customize
缓冲区中创建按钮和输入小部件。这些窗口小部件只创建一次,只要缓冲区处于活动状态,它们就会保留在那里,因此不需要引入覆盖。
但是,Flycheck使用覆盖来突出显示缓冲区中的错误,因为它经常需要删除和添加突出显示。
i text properties
当然也请参见(在同一手册中)。