36.4 语法属性

当语法表不足以灵活描述某门语言的语法时,你可以通过应用 syntax-table 文本属性,覆盖缓冲区中特定字符位置所使用的语法表。 See 文本属性,了解如何应用文本属性。

syntax-table 文本属性的合法取值包括:

syntax-table

若属性值为一个语法表,则该语法表将替代当前缓冲区的语法表,用于确定对应文本字符的语法。

(syntax-code . matching-char)

该格式的 cons 单元为原始语法描述符(see 语法表内部实现),可直接指定对应文本字符的语法分类。

nil

若属性为 nil,则字符的语法按常规方式从当前语法表获取。

Variable: parse-sexp-lookup-properties

若该变量非 nil,语法扫描函数(如 forward-sexp)会关注 syntax-table 文本属性; 否则仅使用当前语法表。

Variable: syntax-propertize-function

若该变量非 nil,其值应为一个函数,用于对指定文本区间应用 syntax-table 属性。 主要供主模式使用,用于安装一个以模式适配方式设置 syntax-table 属性的函数。

该函数由 syntax-ppss(see 获取位置的解析状态)以及语法高亮阶段的 Font Lock 模式调用(see 语法字体锁定)。 调用时传入两个参数 startend,分别为需要处理文本的起始与结束位置。 函数可以在 startend 限定的区域内任意移动光标;此类移动无需使用 save-excursion(see 临时移动)。 函数也可对 end 之前的任意位置调用 syntax-ppss;但如果 Lisp 程序先对某位置调用 syntax-ppss, 之后又修改了更早位置的缓冲区,则该程序需要负责调用 syntax-ppss-flush-cache,清除缓存中已失效的信息。

注意:当该变量非 nil 时,Emacs 会随意移除 syntax-table 文本属性,并依赖 syntax-propertize-function 重新应用。 因此,只要启用了该机制,该函数就必须负责应用主模式所使用的全部 syntax-table 文本属性。 特别地,从 CC Mode 派生的模式不得使用该变量,因为 CC Mode 采用其他方式管理这些文本属性的添加与移除。

Variable: syntax-propertize-extend-region-functions

这个异常钩子会在语法解析代码调用 syntax-propertize-function 之前运行。 其作用是协助确定安全的缓冲区起止位置,以便传给 syntax-propertize-function。 例如,某个主模式可以向该钩子添加函数,用于识别跨行语法结构,并确保处理边界不会落在结构中间。

钩子中的每个函数应接收两个参数 startend,并返回一个包含修正后缓冲区位置的 cons 单元 (new-start . new-end); 无需调整时返回 nil。钩子函数会依次、反复运行,直到全部返回 nil