TextMate语法 - 规则的优先级

时间:2017-08-14 20:31:32

标签: visual-studio-code syntax-highlighting textmate tmlanguage

我正在尝试修改CSharp语言的语法高亮,因此我将在C#string中获得SQL的语法高亮。 TextMate支持嵌入式语言,所以这似乎是可能的。

我在csharp.tmLanguage.json上构建,我希望能够在字符串之前启用带有特殊注释的嵌入式SQL

string query = /*SQL*/ $@"SELECT something FROM ..."

感谢TextMate的Language GrammarsIntroduction to scopes我想出了这个JSON规则

"repository": {
    "embeded-sql": {
        "contentName": "source.sql",            
        "begin": "/\\*\\s*SQL\\s*\\*/\\s*\\$?@?\"",
        "end": "\";",
        "patterns": [
            {
                "include": "source.sql"
            }
        ]
    },
    ...
}

感谢VSCode的Themes, Snippets and ColorizersRunning and Debugging Your Extension我能够测试,这个规则有效。

但我有一个问题,我无法解决。

我的语法规则只有在禁用csharp规则的重要部分时才有效,如果我禁用所有#declarations#script-top-level,则嵌入式SQL工作:

enter image description here

否则,我的规则被csharp规则覆盖,如

  • punctuation.definition.comment.cs
  • string.quoted.double.cs
  • comment.block

enter image description here

问题是,我的规则适用于多个语言元素,csharp定义在定位这些元素时胜出。

标记的元素在哪个基础上?如何编写我的规则,以便在其他语言规则之前获胜并标记该语法?有没有计算规则权重的算法?

解决方案

如果你不能在csharp中劫持评论语法,那么让我们在SQL中使用评论。我通过-- SQL评论启用了规则,并将其应用于逐字字符串。现在它可以工作,但样式有时与字符串混合。需要一些额外的改进,但看起来很有希望。

enter image description here

证明有效的规则是这样的

    "embeded-sql": {
        "contentName": "source.sql",
        "begin": "--\\s*SQL",
        "end": "(?:\\b|^)(?=\"\\s*;)",
        "patterns": [
            {
                "include": "source.sql"
            }
        ]
    },

现在我想enable Intellisense and error checking in such embedded language

1 个答案:

答案 0 :(得分:1)

模式列表中的规则按顺序匹配。

您的规则似乎是评论的专业化,因此您可以将其放在comment.block.cs

之前
    "comment": {
        "patterns": [
            {
                "contentName": "source.sql",
                "begin": "(/\\*\\s*SQL\\s*\\*/)\\s*\\$?@?\"",
                "beginCaptures": {
                    "1": {
                        "patterns": [
                            {
                                "include": "#comment"
                            }
                        ]
                    }
                },
                "end": "\";",
                "patterns": [
                    {
                        "include": "source.sql"
                    }
                ]
            },
            {
                "name": "comment.block.cs",
                "begin": "/\\*",
                "beginCaptures": {
                    "0": {
                        "name": "punctuation.definition.comment.cs"
                    }
                },
                "end": "\\*/",
                "endCaptures": {
                    "0": {
                        "name": "punctuation.definition.comment.cs"
                    }
                }
            },
            ...

快照是使用my语言完成的,该语言只是c# json加上sql嵌入的副本。

enter image description here