24.7.9.1 字体锁定多行处理

确保多行字体锁定结构能可靠重新高亮的一种方法,是为其添加文本属性 font-lock-multiline。凡是属于多行结构的文本,都应当存在该属性且值为非 nil

当字体锁定即将高亮一段文本范围时,会先按需扩展该范围的边界, 使其不会落在带有 font-lock-multiline 属性的文本中间。 随后它会移除该范围内所有的 font-lock-multiline 属性,再执行高亮。 高亮规则(主要是 font-lock-keywords)必须在每次合适的时候重新设置该属性。

警告:不要在大片文本上使用 font-lock-multiline 属性, 否则会导致重新高亮速度变慢。

Variable: 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

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike