不必为缓冲区中所有文本一次性计算文本属性,可以设置为仅在需要依赖这些属性时, 才对对应部分的文本计算属性。
从缓冲区提取文本及其属性的原语是 buffer-substring。
在检查属性之前,该函数会运行异常钩子 buffer-access-fontify-functions。
该变量保存一组用于计算文本属性的函数。
在 buffer-substring 复制缓冲区指定区域的文本与属性前,
会调用此列表中的全部函数。每个函数接收两个参数,指定被访问的缓冲区范围。
(当前缓冲区始终为操作对象。)
函数 buffer-substring-no-properties 不会调用这些函数,
因为它本身就忽略文本属性。
为避免同一缓冲区区域被重复调用钩子函数,
可以使用变量 buffer-access-fontified-property。
若该变量值非 nil,则为一个符号,用作文本属性名。
该文本属性的非 nil 值表示当前字符的其他文本属性已计算完成。
若 buffer-substring 指定范围内的所有字符,
该属性均为非 nil,则 buffer-substring
不会调用 buffer-access-fontify-functions 中的函数,
直接认为这些字符已具备正确属性并复制现有属性。
该功能的常规用法是:buffer-access-fontify-functions
中的函数在处理字符时,除添加其他属性外,一并设置该属性,
从而避免对同一文本重复执行。