33.19.7 文本属性的惰性计算

不必为缓冲区中所有文本一次性计算文本属性,可以设置为仅在需要依赖这些属性时, 才对对应部分的文本计算属性。

从缓冲区提取文本及其属性的原语是 buffer-substring。 在检查属性之前,该函数会运行异常钩子 buffer-access-fontify-functions

Variable: buffer-access-fontify-functions

该变量保存一组用于计算文本属性的函数。 在 buffer-substring 复制缓冲区指定区域的文本与属性前, 会调用此列表中的全部函数。每个函数接收两个参数,指定被访问的缓冲区范围。 (当前缓冲区始终为操作对象。)

函数 buffer-substring-no-properties 不会调用这些函数, 因为它本身就忽略文本属性。

为避免同一缓冲区区域被重复调用钩子函数, 可以使用变量 buffer-access-fontified-property

Variable: buffer-access-fontified-property

若该变量值非 nil,则为一个符号,用作文本属性名。 该文本属性的非 nil 值表示当前字符的其他文本属性已计算完成。

buffer-substring 指定范围内的所有字符, 该属性均为非 nil,则 buffer-substring 不会调用 buffer-access-fontify-functions 中的函数, 直接认为这些字符已具备正确属性并复制现有属性。

该功能的常规用法是:buffer-access-fontify-functions 中的函数在处理字符时,除添加其他属性外,一并设置该属性, 从而避免对同一文本重复执行。