33.19.10 文本属性为何不是区间

部分支持为缓冲区文本添加属性的编辑器,允许用户在文本中指定区间并将属性附加到这些区间上。这类编辑器允许用户或程序员确定各个区间的起止位置。我们在 Emacs Lisp 中刻意设计了另一类接口,以避免与文本修改相关的某些矛盾行为。

如果划分为区间的实际结果具有语义意义,就意味着你可以区分两种缓冲区:一种是仅单个区间拥有某属性,另一种是相同文本被划分为两个区间且均拥有该属性。

假设你对只有一个区间的缓冲区删除部分文本,缓冲区中剩余的文本为一个区间,而剪切环(以及撤销列表)中的副本成为独立区间。之后如果你将删除的文本粘贴回来,就会得到两个属性相同的区间。因此,编辑操作无法保留单个区间与两个区间的区别。

假设我们尝试通过在插入文本时合并两个区间来修复此问题。对于原本是单个区间的缓冲区,这一方式可以正常工作。但如果我们有两个相邻且属性相同的区间,删除其中一个区间的文本再粘贴回来,原本解决问题的区间合并机制反而会引发问题:粘贴后只会剩下一个区间。编辑操作依然无法保留单个区间与两个区间的区别。

在区间边界处插入文本同样会引发没有合理解答的问题。

不过,对于 “此缓冲区或字符串位置的文本属性是什么?” 这类问题,很容易让编辑行为保持一致。因此我们确定只有这类问题是有意义的,并未实现查询区间起止位置的相关功能。

在实际使用中,你通常可以使用文本属性搜索函数代替显式的区间边界。你可以将它们视为查找区间边界,前提是区间始终尽可能合并。See 文本属性搜索函数

Emacs 同时也提供作为显示功能的显式区间,参见 覆盖层