Я создаю языковое расширение в 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
.
Я проверил предустановленное расширение языка cpp vscode.
Они также используют scopeName для source.c
и source.c.platform
.
Я так понимаю, для тех же целей?
Я что-то проглядел? Спасибо за помощь.
Если вы хотите использовать эти области из разных 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
Так что это больше похоже на меру обратной совместимости на случай, если какие-либо сторонние грамматики все еще используют ее.
Спасибо еще раз! После отпуска буду тестировать. Но я считаю, что это как раз то, что мне нужно.