如何编写TextMate规则匹配.gabc文件中的GABC/NABC片段?
编写TextMate规则匹配GABC/NABC片段
要给.gabc文件的括号内GABC、NABC片段实现语法高亮,我们可以通过分层的TextMate规则来精准匹配,以下是具体实现方案:
核心思路
先匹配整个括号包裹的区域,再在其中细分三类元素:GABC片段、分隔符|、NABC片段,为每类元素分配独立的scope,后续就能通过theme文件为不同scope设置差异化样式。
完整规则示例(JSON格式)
{ "scopeName": "source.gabc", "patterns": [ { "name": "meta.gabc.bracket-wrapper", "begin": "\\(", "end": "\\)", "beginCaptures": { "0": { "name": "punctuation.bracket.gabc.open" } }, "endCaptures": { "0": { "name": "punctuation.bracket.gabc.close" } }, "patterns": [ // 匹配GABC片段:匹配到|或)之前的所有非分隔符内容 { "name": "entity.name.section.gabc", "match": "^[^|)]+" }, // 匹配GABC与NABC的分隔符| { "name": "punctuation.separator.gabc-nabc", "match": "\\|" }, // 匹配NABC片段:|之后到)之前的所有内容 { "name": "entity.name.section.nabc", "match": "(?<=\\|)[^)]+" }, // 处理纯NABC特殊场景(如(::i+)) { "name": "entity.name.section.nabc", "match": "^(::[^)]+)$" } ] } ] }
规则细节解释
- 括号匹配:通过
begin和end匹配括号的首尾,同时给括号本身分配标点类scope,方便统一样式。 - GABC片段匹配:用
^[^|)]+匹配括号内开头到|或)的内容,覆盖(c3)这类纯GABC场景。 - 分隔符匹配:单独给
|分配separator类型的scope,清晰区分两部分内容。 - NABC片段匹配:用正向断言
(?<=\\|)确保匹配的是|之后的内容,覆盖(f|ta)这类标准场景;额外规则处理(::i+)这类纯NABC的特殊格式。
适配多分隔符场景
如果需要支持括号内多组GABC/NABC交替的场景(如(G1|N1|G2|N2)),可以将内部patterns替换为循环匹配规则:
"patterns": [ { "match": "([^|)]+)(\\|)?", "captures": { "1": { "name": "entity.name.section.gabc" }, "2": { "name": "punctuation.separator.gabc-nabc" } } }, { "match": "([^|)]+)(\\|)?", "captures": { "1": { "name": "entity.name.section.nabc" }, "2": { "name": "punctuation.separator.gabc-nabc" } } }, { "name": "entity.name.section.nabc", "match": "^(::[^)]+)$" } ]
测试验证
将规则加入VSCode扩展的tmLanguage.json文件后,可通过VSCode的「开发者:检查编辑器令牌和范围」(快捷键Ctrl+Shift+P调出)功能,查看每个片段的scope是否正确匹配,确保高亮逻辑生效。
内容的提问来源于stack exchange,提问作者Laércio de Sousa
相关产品推荐
相关产品推荐

