sublime - PackageDev自定义语法高亮规则 (2)

几个正则表达式中有部分完全相同的情况并不少见,为避免重复,可以使用变量代替。

variables: ident: '[A-Za-z_][A-Za-z_0-9]*' contexts: main: - match: '\b{{ident}}\b' scope: keyword.control

变量必须在.sublime-syntax文件顶层定义,并通过{{varname}}在正则表达式中引用。

Variables may themselves include other variables. Note that any text that doesn't match {{[A-Za-z0-9_]+}} won't be considered as a variable, so regexes can still include literal {{ characers, for example.

实例 嵌套循环匹配

例:括号自动匹配, 高亮显示单独的闭括号)

contexts: main: - match: \( push: brackets - match: \) scope: invalid.illegal.stray-bracket-end brackets: - match: \) pop: true - include: main 高级栈的使用

例:匹配typedef的两种定义

typedef int coordinate_t; typedef struct { int x; int y; } point_t;

匹配代码:

main: - match: \btypedef\b scope: keyword.control.c set: [typedef_after_typename, typename] typename: - match: \bstruct\b set: - match: "{" set: - match: "}" pop: true - match: \b[A-Za-z_][A-Za-z_0-9]*\b pop: true typedef_after_typename: - match: \b[A-Za-z_][A-Za-z_0-9]*\b scope: entity.name.type pop: true

main中使用匹配将两个context推入堆栈,最右边的处于栈的最顶层,先匹配,当最右边弹出后,才开始匹配左边的。

为了简洁起见,typename中使用了context的匿名写法。

对正则表达式中group的引用

例:PHP与 Heredocs语法

contexts: main: - match: <<<([A-Za-z][A-Za-z0-9_]*) push: heredoc heredoc: - meta_scope: string.unquoted.heredoc - match: ^\1; pop: true

此处使用了 \1 符号代指之前匹配的group

语法测试

可以定义一个语法测试文本来自动检测,而不需要手动通过show_scope_name命令检测
具体见官方文档。

关于scope的语法容日后再行研究 引用:

非官方文档(推荐)
官方文档
中文版百度快照

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydpdf.html