VSCode 扩展:在我的中嵌入标准语言

Rus*_*Rus 5 visual-studio-code vscode-extensions

我需要JavaScript在我的语言扩展中嵌入标准语言(例如)。这意味着我想在file.js. 我可以这样做吗(如何)?

感谢您提供任何示例!

Mat*_*ner 9

语法突出显示很简单,只需包含要嵌入的语言的顶级范围即可。例如, Html用于"include": "source.js"在脚本块内添加 js 语法突出显示。

IntelliSense 的难度要大得多。再次,看看vscode的HTML扩展是做什么的。它基本上将 html 文件拆分为虚拟文档(一个用于脚本块,一个用于样式块,一个用于 html),然后嵌入每种语言所需的语言库以提供 IntelliSense。Vetur扩展也做了类似的事情。在这两种情况下,扩展程序都拥有顶级文档(html 或 vue),然后根据发出 IntelliSense 请求的位置委托给正确的嵌入式语言

  • 谢谢。这很有帮助,我不知道如何进行语法突出显示部分。我可以将它包含在 package.json 的贡献属性中(它为您提供自动完成功能,尽管不是全部)。然而,“例如”引用的链接已失效,链接到的行号不再位于同一位置。琐碎的第一世界问题,只是想让你知道在你的答案中包含一个代码片段可能会有所帮助。谢谢! (2认同)

小智 6

您可以使用附加语法继续嵌入式语言指南中的abc-lang示例:syntaxes/abc.tmLanguage.json

{
    "scopeName": "source.abc",
    "patterns": [ { "include": "#expression" } ],
    "repository": {
        "expression": {
            "patterns": [
                { "include": "#letter" },
                { "include": "#paren-expression" },
                { "include": "#code" }
            ]
        },
        "letter": {
            "match": "a|b|c",
            "name": "keyword.letter"
        },
        "paren-expression": {
            "begin": "\\(",
            "end": "\\)",
            "beginCaptures": {
                "0": { "name": "punctuation.paren.open" }
            },
            "endCaptures": {
                "0": { "name": "punctuation.paren.close" }
            },
            "name": "expression.group",
            "patterns": [ { "include": "#expression" } ]
        },
        "code": {
            "begin": "```js",
            "end": "```",
            "beginCaptures": {
                "0": { "name": "punctuation.code.open" }
            },
            "endCaptures": {
                "0": { "name": "punctuation.code.close" }
            },
            "name": "meta.embedded.block.javascript",
            "patterns": [ { "include": "source.js" } ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Matt 评论的固定链接是https://github.com/microsoft/vscode/blob/5712574281bb096a2dd4ceda7e266d507f775b45/extensions/html/syntaxes/html.tmLanguage.json#L1936

  • 因为其他人到达这里让我感到困惑;“source.js”不是文件名,而是 JavaScript 语法的名称。 (4认同)