我正在为自己在vscode中创建一个语言扩展。因为它将与不同的文件类型相关联,所以我计划为特定的规则创建不同的tmlanguge文件。根据这的说法,我可以扩展scopeName来实现这一点。
因此,我在我的./package.json文件中创建了如下所示:
{
"name": "tst",
"displayName": "Test Language",
"description": "A test for language extension",
"version": "0.0.1",
"engines": {
"vscode": "^1.34.0"
},
"contributes": {
"languages": [{
"id": "tst",
"aliases": ["Test", "tst"],
"extensions": [".tst",".type1",".type2"],
"configuration": "./language-configuration.json"
}],
"grammars": [{
"language": "tst",
"scopeName": "source.tst",
"path": "./syntaxes/tst.tmLanguage.json"
},
{
"scopeName": "source.tst.type1",
"path": "./syntaxes/type1.tmLanguage.json"
},
{
"scopeName": "source.tst.type2",
"path": "./syntaxes/type2.tmLanguage.json"
}]
}
}然后,我在./syntaxes/tst.tmLanguage.json中创建了基本规则,.type1和.type2都是用我的语法应用的。
{
"name": "Test",
"patterns": [
{
"match": "test",
"name": "constant.character"
}
],
"scopeName": "source.tst"
}之后,我还制作了类似于以下内容的./syntaxes/type1.tmLanguage.json:
{
"name": "type1",
"patterns": [
{
"match": "type1",
"name": "constant.language"
}
],
"scopeName": "source.tst.type1"
}在.type1中,任何规则都不起作用。

我希望图片中的两个文件都能识别test和type1.。我检查了vscode预装的cpp语言扩展。他们还将scopeName用于source.c和source.c.platform。我想是为了类似的目的吧?
我是不是忽略了什么?谢谢你的帮助。
发布于 2019-05-28 11:35:15
如果要在主语法中使用来自不同tmLanguage文件的这些作用域,则必须显式地include它们:
{
"name": "Test",
"patterns": [
{
"match": "test",
"name": "constant.character"
},
{
"include": "source.tst.type1"
},
{
"include": "source.tst.type2"
}
],
"scopeName": "source.tst"
}

关于内置的cpp扩展和platform.tmLanguage.json,据我所知,c和cpp语法并没有积极使用它。在cpp/build/update-grammars.js中有这样的评论
// `source.c.platform` which is still included by other grammars因此,这听起来更像是一种向后兼容的措施,以防任何第三方语法仍然使用它。
https://stackoverflow.com/questions/56330454
复制相似问题