VSCode 语言扩展:一种语言可以通过代码嵌入到另一种语言中吗?

VSCode language extension: can a language be embedded into another through code?

该扩展添加了对 Renpy 语言的支持,这是一种与 Python 非常相似的语言。在这种语言中,可以在 different ways.

中嵌入 Python 代码

单行语句:

define e = Character("Eileen", who_color="#c8ffc8")
default sidebar = False
$ sampleFunction("Eileen", 1.0)

要在单行语句中嵌入 python,我使用以下 TextMate Grammar 模式:

        {
          "comment": "Match begin and end of python one line statements",
          "name": "meta.embedded.python.line",
          "begin": "(?<=(\$|define|default)\s)",
          "end": "\R$",
          "patterns": [{ "include": "source.python" }]
        }

在这种情况下,我可以知道语句何时结束。

Python块:

python:
    def foo():
        return "bar"

这些块可以嵌套在其他语言块中,例如:

init:
    image movie = Movie()

    python:
        povname = ""
        pov = DynamicCharacter("povname", color=(255, 0, 0, 255))

    $ ectc = Character('Eileen', color=(200, 255, 200, 255))

在块的情况下,由于它是用缩进分隔的,所以我无法确定它在哪里结束。如果这些块不能嵌套,我可以用正则表达式捕获结尾,例如^(?=\S),因为它可以嵌套我无法检测到它何时结束。

我试图通过 SemanticTokenProvider, but it seems that it's not possible to add a textmate scope using the SemanticTokensBuilder 添加 TextMate 范围 source.python。也尝试过使用 TextMate 模式但没有成功。

我想找到一种方法使 Python 块的内容具有 source.python TextMate 范围,无论它是否嵌套。

如果块后总是有一行与单词 python: 具有相同的缩进,您可以尝试

{
  "begin": "^(\s*)(python:)",
  "end": "^\1(?=\S)",
  "beginCaptures": { "2": { "name": "keyword.other" } },
  "patterns": [{ "include": "source.python" }]
}