Как использовать несколько файлов tmLanguage в расширении vscode - PullRequest
1 голос
/ 27 мая 2019

Я создаю расширение языка в vscode для себя. Поскольку он будет ассоциироваться с разными типами файлов, я планирую создавать разные файлы tmlanguge для определенных правил. Согласно this , я мог бы расширить 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.

enter image description here

Я надеюсь, что оба файла на картинке могут распознавать test и type1. Я проверил предустановленное расширение языка cpp для vscode. Они также используют scopeName для source.c и source.c.platform. Я предполагаю, что это для аналогичной цели?

Я что-то упустил? Спасибо за помощь.

1 Ответ

0 голосов
/ 28 мая 2019

Если вы хотите использовать эти области из разных файлов 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

Так что это больше похоже на меру обратной совместимости в случае, если какие-либо сторонние грамматики все еще используют его.

...