确保多行字体锁定结构能可靠重新高亮的一种方法,是为其添加文本属性
font-lock-multiline。凡是属于多行结构的文本,都应当存在该属性且值为非 nil。
当字体锁定即将高亮一段文本范围时,会先按需扩展该范围的边界,
使其不会落在带有 font-lock-multiline 属性的文本中间。
随后它会移除该范围内所有的 font-lock-multiline 属性,再执行高亮。
高亮规则(主要是 font-lock-keywords)必须在每次合适的时候重新设置该属性。
警告:不要在大片文本上使用 font-lock-multiline 属性,
否则会导致重新高亮速度变慢。
若变量 font-lock-multiline 设为 t,
字体锁定会尝试自动为多行结构添加 font-lock-multiline 属性。
但这并非通用解决方案,因为它会在一定程度上降低字体锁定的速度。
它可能会遗漏某些多行结构,或者把属性设置得过大或过小。
对于 matcher 为函数的元素,该函数应确保子匹配 0 覆盖整个相关多行结构,
即便只会高亮其中一小部分。很多时候直接手动添加
font-lock-multiline 属性会更简单可靠。
font-lock-multiline 属性的作用是确保正确重新高亮;
它并不会自动识别新的多行结构。要识别这些结构,
要求字体锁定模式每次处理足够大的文本块。很多情况下这会偶然满足,
让人感觉多行结构仿佛“神奇地”正常工作。如果你将
font-lock-multiline 变量设为非 nil,
这种错觉会更明显,因为那些被找到的结构之后的高亮会被正确更新。
但这并不可靠。
要可靠地找到多行结构,你必须要么在字体锁定模式处理之前
手动为文本加上 font-lock-multiline 属性,
要么使用 font-lock-fontify-region-function。