如何在 tmLanguge 文件中交错两种语言支持文件?

How to interleave two language support files in a tmLanguge file?

我正在尝试制作一个 VS 代码扩展来突出显示 Pollen 标记文件。这些是带有嵌入式变量和 Racket 代码的纯文本文件。变量有这样的语法(稍后通过预处理器拼接到文本中):

Some text ◊variable-name text continued

并且可以使用类似的语法嵌入 Racket 函数:

One plus two is ◊(number->string (+ 1 2)).

我有一个支持 Racket 语法的 tmLanguage 文件,还有一个支持 Pollen 语法的 tmlLanguage 文件(文本 + 变量 + 内嵌函数 source.racket)。我也希望它能正确突出显示这段代码,但想不出一个干净的解决方案:

◊n plus ◊m is ◊(number->string (+ ◊n ◊m)).

换句话说,Pollen语法中的Racket语法中的Pollen语法。是否可以仅在事物的 Pollen 端实现这样的语法高亮显示,而无需制作支持嵌入式 Pollen 代码的特殊 source.racket 文件?

比如首先突出显示球拍然后然后再次浏览文本,使用花粉规则突出显示(并覆盖当前颜色,如果存在)?

我发现了关于 injections 的顶级子句,它完全符合我的需要:

"injections": {
    "L:meta.function-call.racket": {
        "patterns": [
            {
                "include": "text.pollen"
            }
        ]
    }
},

它在每个 meta.function-call.racket 作用域中注入一个 { "include": "text.pollen" } — 我不需要编辑每个使用此作用域的地方(这很有用,因为它在很多地方 在另一个文件中)。

可以找到更多信息 in this thread in Atom's forums and in this gist describing a making-of grammar for Atom