叠加层有什么作用,它们与文本属性有何不同?


23

手动状态:

为了呈现功能,您可以使用覆盖来更改缓冲区文本在屏幕上的外观。

从名称上看,它暗示可以用来在现有文本上创建“图层”,但是上面的描述似乎表明它改变了文本的外观,感觉与文本属性非常相似。

覆盖层的具体用途是什么?他们提供哪些文本属性不提供的功能?可以使用它们在缓冲区(如弹出窗口,信息框等)中的文本上写文本吗?


阅读该手册部分的内容不只是一句话。IMO,这很清楚地解释了。包括与文本属性的差异。i text properties当然也请参见(在同一手册中)。
德鲁

Answers:


10

什么是叠加层?

首先,它们是简单的对象。这将在后面讨论。

就像您自己说的那样,它们代表应用于缓冲区区域顶部的图层。这些层具有文本属性,就像缓冲区中的实际文本一样。叠加层具有的任何常规属性都将应用于其下方的文本。但是,有一些叠加层特有的属性(如果应用于文本,它们不会执行任何操作)。

为什么有用?

基于以上两个原因,我暗示了:

他们是对象

这意味着您可以将它们存储在列表中并轻松处理它们。您可以更改它们的属性,而不必跟踪它们现在的位置。更好的是,您可以使用它们来跟踪缓冲区中的内容。

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

他们什么时候坏?

覆盖比文本属性要苛刻得多(在处理方面)。一些相关的操作(例如文本插入,如果我没记错的话)所花费的时间与缓冲区中的覆盖层数量成正比。因此,当您需要大量它们时,它们不合适。在这种情况下,您应该辞职到文本属性。


12

叠加层和文本属性具有完全相同的功能。它们将更改页边距,按钮,面,边缘图标,工具提示,图像,突出显示等添加到文本的特定部分。但是,在概念上存在巨大差异:

叠加是独立的,文本属性不是。Emacs具有独特的覆盖类型,但是没有“文本属性类型”。文本属性固有地与设置它们的字符串相关。另一方面,叠加层会附加到缓冲区。

这种差异有一些实际含义:

  • 您可以在不属于任何缓冲区的字符串上设置文本属性,而始终需要覆盖的缓冲区。
  • 您无法在某个位置保留添加的文本属性的列表,而保留添加到缓冲区的覆盖列表很容易,例如,一次性删除所有覆盖。
  • 您可以有一个覆盖层,可以在一个文本上设置多个覆盖层(例如,一个脸,一个工具提示和一个条纹图标),因此您可以使用覆盖层来将一组“属性”作为一个单元来管理,而没有这样的文字属性。您分别设置它们,并分别管理它们。

所有这些的本质是您可以与文本内容分开管理覆盖。从概念上讲,即使它们与文本无关,也将它们用于缓冲区中显示的内容。

实际上,如果要添加到文本的内容经常更改,则将使用叠加,而如果填充内容是恒定的,则将使用文本属性。

例如,Emacs使用文本属性在M-x customize缓冲区中创建按钮和输入小部件。这些窗口小部件只创建一次,只要缓冲区处于活动状态,它们就会保留在那里,因此不需要引入覆盖。

但是,Flycheck使用覆盖来突出显示缓冲区中的错误,因为它经常需要删除和添加突出显示。

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.