【问题标题】:How to use multiple tmLanguage files in vscode extension如何在 vscode 扩展中使用多个 tmLanguage 文件
【发布时间】:2019-10-13 06:55:23
【问题描述】:

我正在 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 中的任何规则都不适用。

希望图片中的两个文件都能识别testtype1。 我检查了 vscode 预装的 cpp 语言扩展。 他们还将 scopeName 用于source.csource.c.platform。 我猜是为了类似的目的?

我是否忽略了什么? 感谢您的帮助。

【问题讨论】:

    标签: visual-studio-code vscode-extensions tmlanguage


    【解决方案1】:

    如果你想在主语法中使用来自不同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
    

    所以这听起来更像是一种向后兼容的措施,以防任何第三方语法仍在使用它。

    【讨论】:

    • 再次感谢!我会在假期后测试它。但我相信这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2023-01-29
    • 2019-10-19
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多