通常情况下,font-lock-keywords 中的元素**不应跨行匹配**;
这种方式无法可靠工作,因为字体锁定一般只扫描缓冲区的一部分,
可能会错过从扫描起始行边界开始的多行结构。(扫描通常从行首开始。)
让匹配多行结构的元素正常工作包含两个方面:正确的 识别(identification) 与正确的 重新高亮(rehighlinghting)。 前者指字体锁定能够找到所有多行结构;后者指当多行结构被修改时, 字体锁定能正确重新高亮所有相关文本—例如,原本属于多行结构的文本不再属于该结构时。 这两方面紧密相关,通常修复其中一个似乎会让另一个也正常工作。 但要获得可靠结果,必须显式处理这两方面。
确保正确识别多行结构有三种方法:
font-lock-extend-region-functions 添加函数,
由其完成**识别**并扩展扫描范围,使扫描文本不会在多行结构中间开始或结束。
font-lock-fontify-region-function 扩展扫描范围,
避免扫描在多行结构中间起止。
font-lock-multiline 属性,
指示字体锁定不要在该结构中间起止扫描。
实现多行结构重新高亮有若干方法:
font-lock-multiline 属性。
若结构任意部分被修改,将重新高亮整个结构。
某些场景下可通过设置变量 font-lock-multiline 自动实现,详见该变量说明。
jit-lock-contextually 已启用并依赖其工作。
它只会重新高亮修改位置之后的部分,并略有延迟。
该方式仅在多行结构各部分的高亮**不依赖后续行文本**时有效。
由于 jit-lock-contextually 默认启用,这是一种很实用的方案。
jit-lock-defer-multiline 属性。
该方式仅在使用 jit-lock-contextually 时生效,重新高亮同样有延迟,
但与 font-lock-multiline 类似,可处理高亮依赖后续行的情况。
syntax-multiline 文本属性。
最常见的场景是:‘FOO’ 上应用的语法属性依赖后续文本 ‘BAR’;
通过在整个 ‘FOO...BAR’ 上添加该属性,可确保 ‘BAR’ 发生变化时,
‘FOO’ 的语法属性也会重新计算。
注意:要使其生效,模式需要将 syntax-propertize-multiline
加入 syntax-propertize-extend-region-functions。