VS Code 中嵌入语言的语法高亮

Bru*_*ett 5 javascript visual-studio-code

我正忙于在 Visual Studio Code 中制作自己的语法扩展。例如,该语言称为 Snake,当打开“*.snk”类型的文件(例如“hello-world.snk”)时,语法就会生效。到现在为止还挺好。我可以教 VS Code 在语法文件中突出显示 Snake 的语法,并且一切正常。

但我无法让嵌入式语言语法突出显示工作。

在“.snk”文件中,可以包含 javascript 代码块。我能够让 VS Code 为 这些嵌入的 javascript 代码块中的 javascript(如片段)提供编程语言支持(通过文件中的embeddedLanguages属性tmLanguage.json)。但我无法让 javascript语法高亮显示在 javascript 代码块中工作。

事实上,文档完全没有提到让嵌入式语言的语法突出显示工作。它只讨论了诸如注释代码和触发代码片段之类的编程功能。

谁能帮我?

小智 6

在packages.json中

     "embeddedLanguages": {
                    "source.js": "javascript",
                    "meta.embedded.block.javascript": "javascript"
      }
Run Code Online (Sandbox Code Playgroud)

在你的语法 def 文件中:

 "jscode": {
            "patterns": [
                {
                    "name": "js.block.sl",
                    "begin": "js:\\s*{{{",
                    "end": "^\\s*}}}\\s*$",
                    "patterns": [
                        {
                            "begin": "(^|\\G)(\\s*)(.*)",
                            "end": "^\\s*}}}\\s*$",
                            "contentName": "meta.embedded.block.javascript",
                            "patterns": [
                                {
                                    "include": "source.js"
                                }
                            ]
                        }
                    ]
                }
            ]
        },
Run Code Online (Sandbox Code Playgroud)

调整开始和结束模式。

简而言之,您需要匹配块的开始和结束。然后在匹配块中,匹配js并包含所有js高亮模式。

我如何学习这个?来自 vscode 源代码。

https://github.com/microsoft/vscode/blob/master/extensions/markdown-basics/package.json

https://github.com/microsoft/vscode/blob/master/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json#L959


小智 2

我一直在寻找类似的东西,这就是令我震惊的东西。

.tmLanguage.json这是我的语言“mylang”的示例模式。它适用于以'or开头"并以相同字符结尾的字符串。在字符串中,有不同颜色的转义字符,并且因为“mylang”支持字符串插值,所以您可以有类似 的内容"value is $value",其中变量引用应该以不同的颜色(与整体字符串颜色相比)。

基本的嵌入式突出显示,如果您有明确的锚点来标记嵌入式语言片段的开始和结束,您可以调整beginend,它应该可以工作。

"strings": {
            "name": "string.quoted.double.mylang",
            "begin": "(\"|')",
            "end": "\\1",
            "patterns": [
                {
                    "name": "constant.character.escape.mylang",
                    "match": "\\{[a-z.0-9,A-Z*_/~-]*\\}|\\\\|\\\\0\\d\\d|\\\\\\w"
                },
                {
                    "name": "variable.name.mylang",
                    "match": "\\$[a-z][a-z.0-9A-Z]*|\\$\\([a-z.0-9,A-Z-]*\\)(\\([.0-9-]+\\))?"
                }
            ]
        }
Run Code Online (Sandbox Code Playgroud)

现在,如果我要在代码中定义一个新对象,例如使用以下语法:

var mjs = JSON('{"value": 42}')
Run Code Online (Sandbox Code Playgroud)

var是语言关键字,JSON是类/类型名称。构造JSON函数获取包含 JSON 文本的字符串,并将其解析为树。

他们有自己的高亮颜色。里面的绳子''有自己的整体颜色。我现在希望正则表达式之间的所有内容都JSON\\('根据'\\)各种子模式进行着色(例如键可能是".*"\s+:等等)

请注意,如果我从字面上指定JSON\\(为开始模式,则JSON将会成为其中的一部分,并且不会使用类型名称的颜色突出显示。使用后视可能会有所帮助:(?<JSON)\\(如果内存正确的话。

并重复整个过程YAML('...')XML('...'), ...