如何在 VSCode 语法突出显示的 textmate 语言定义中定义模板字符串?
How to define template strings in textmate language definitions for VSCode syntax highlighting?
我有一个包含这些组件的脚本:
- 条款:
/[a-z][a-z0-9]*(?:-[a-z0-9]+)*/
- 字符串:
<.+>
- 人数:
\d+
不过,字符串也可以是“模板字符串”,并且嵌套在terms/strings/numbers里面。它们由 {...}
大括号分隔,如:
term <string {term(another-term, 123)}>
如何让 VSCode 正确突出显示模板字符串中大括号内的内容?我用 this 生成了一个项目,它给了我这个 <mystring>.tmLanguage.json
:
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "myscript",
"patterns": [
{
"include": "#terms"
},
{
"include": "#strings"
},
{
"include": "#numbers"
}
],
"repository": {
"terms": {
"patterns": [
{
"name": "term.control.myscript",
"match": "\b([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\b"
},
{
"name": "term.context.myscript",
"match": "\b(\{[^\}]+\})\b"
}
]
},
"numbers": {
"patterns": [
{
"name": "constant.numeric.integer.myscript",
"match": "\b(\d+)\b"
},
{
"name": "constant.numeric.decimal.myscript",
"match": "\b(\d+\.\d+)\b"
}
]
},
"strings": {
"name": "string.quoted.double.myscript",
"begin": "<",
"end": ">",
"patterns": [
{
"name": "constant.character.escape.myscript",
"match": "\\."
}
]
}
},
"scopeName": "source.myscript"
}
但是,我得到这个:
我以前从未为编辑器做过语法高亮显示,所以不确定在这里真正调试的地方。
我通过使用 textmate 语言语法中的特殊范围来实现此功能:
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "mylang",
"patterns": [
{
"include": "#terms"
},
{
"include": "#punctuations"
},
{
"include": "#strings"
},
{
"include": "#numbers"
}
],
"repository": {
"terms": {
"patterns": [
{
"name": "entity.name.type.language.mylang",
"match": "([a-z][a-z0-9]*(?:-[a-z0-9]+)*)"
},
{
"name": "entity.name.type.language.parens.mylang",
"begin": "([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\(",
"end": "\)",
"patterns": [
{
"includes": "#terms"
},
{
"includes": "#strings"
},
{
"includes": "#numbers"
}
]
}
]
},
"numbers": {
"patterns": [
{
"name": "constant.numeric.integer.mylang",
"match": "\b(\d+)\b"
},
{
"name": "constant.numeric.decimal.mylang",
"match": "\b(\d+\.\d+)\b"
}
]
},
"punctuations": {
"patterns": [
{
"name": "punctuation.separator.parameter.mylang",
"match": ","
},
{
"name": "punctuation.curly.open.mylang",
"match": "\{"
},
{
"name": "punctuation.curly.close.mylang",
"match": "\}"
}
]
},
"strings": {
"name": "string.mylang",
"begin": "\<",
"end": "\>",
"patterns": [
{
"name": "constant.character.escape.mylang",
"match": "\\."
},
{
"name": "punctuation.term.mylang",
"begin": "\{",
"beginCaptures": {
"0": {
"name": "meta.brace.curly.mylang"
}
},
"end": "\}",
"endCaptures": {
"0": {
"name": "meta.brace.curly.mylang"
}
},
"patterns": [
{
"include": "#terms"
},
{
"include": "#numbers"
},
{
"include": "#strings"
}
]
}
]
}
},
"scopeName": "source.mylang"
}
我有一个包含这些组件的脚本:
- 条款:
/[a-z][a-z0-9]*(?:-[a-z0-9]+)*/
- 字符串:
<.+>
- 人数:
\d+
不过,字符串也可以是“模板字符串”,并且嵌套在terms/strings/numbers里面。它们由 {...}
大括号分隔,如:
term <string {term(another-term, 123)}>
如何让 VSCode 正确突出显示模板字符串中大括号内的内容?我用 this 生成了一个项目,它给了我这个 <mystring>.tmLanguage.json
:
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "myscript",
"patterns": [
{
"include": "#terms"
},
{
"include": "#strings"
},
{
"include": "#numbers"
}
],
"repository": {
"terms": {
"patterns": [
{
"name": "term.control.myscript",
"match": "\b([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\b"
},
{
"name": "term.context.myscript",
"match": "\b(\{[^\}]+\})\b"
}
]
},
"numbers": {
"patterns": [
{
"name": "constant.numeric.integer.myscript",
"match": "\b(\d+)\b"
},
{
"name": "constant.numeric.decimal.myscript",
"match": "\b(\d+\.\d+)\b"
}
]
},
"strings": {
"name": "string.quoted.double.myscript",
"begin": "<",
"end": ">",
"patterns": [
{
"name": "constant.character.escape.myscript",
"match": "\\."
}
]
}
},
"scopeName": "source.myscript"
}
但是,我得到这个:
我以前从未为编辑器做过语法高亮显示,所以不确定在这里真正调试的地方。
我通过使用 textmate 语言语法中的特殊范围来实现此功能:
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "mylang",
"patterns": [
{
"include": "#terms"
},
{
"include": "#punctuations"
},
{
"include": "#strings"
},
{
"include": "#numbers"
}
],
"repository": {
"terms": {
"patterns": [
{
"name": "entity.name.type.language.mylang",
"match": "([a-z][a-z0-9]*(?:-[a-z0-9]+)*)"
},
{
"name": "entity.name.type.language.parens.mylang",
"begin": "([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\(",
"end": "\)",
"patterns": [
{
"includes": "#terms"
},
{
"includes": "#strings"
},
{
"includes": "#numbers"
}
]
}
]
},
"numbers": {
"patterns": [
{
"name": "constant.numeric.integer.mylang",
"match": "\b(\d+)\b"
},
{
"name": "constant.numeric.decimal.mylang",
"match": "\b(\d+\.\d+)\b"
}
]
},
"punctuations": {
"patterns": [
{
"name": "punctuation.separator.parameter.mylang",
"match": ","
},
{
"name": "punctuation.curly.open.mylang",
"match": "\{"
},
{
"name": "punctuation.curly.close.mylang",
"match": "\}"
}
]
},
"strings": {
"name": "string.mylang",
"begin": "\<",
"end": "\>",
"patterns": [
{
"name": "constant.character.escape.mylang",
"match": "\\."
},
{
"name": "punctuation.term.mylang",
"begin": "\{",
"beginCaptures": {
"0": {
"name": "meta.brace.curly.mylang"
}
},
"end": "\}",
"endCaptures": {
"0": {
"name": "meta.brace.curly.mylang"
}
},
"patterns": [
{
"include": "#terms"
},
{
"include": "#numbers"
},
{
"include": "#strings"
}
]
}
]
}
},
"scopeName": "source.mylang"
}