几个正则表达式中有部分完全相同的情况并不少见,为避免重复,可以使用变量代替。
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: truemain中使用匹配将两个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命令检测
具体见官方文档。
非官方文档(推荐)
官方文档
中文版百度快照