【问题标题】:TextMate Grammar -- precedence of rulesTextMate 语法——规则的优先级
【发布时间】:2017-08-14 20:31:32
【问题描述】:

我正在尝试修改 CSharp 语言的语法突出显示,因此我将在 C# 字符串中获得 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 有效:

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

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

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

标记元素的依据是什么?如何编写我的规则,以便在其他语言规则之前胜出并标记该语法?有没有计算规则权重的算法?


解决方案

如果您无法在 csharp 中劫持注释语法,让我们在 SQL 中使用注释。我制定了一条由-- SQL 评论启用的规则,并将其应用于逐字字符串。现在它可以工作了,但样式有时会与字符串混合。需要一些额外的改进,但看起来很有希望。

证明有效的规则是这样的

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

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

【问题讨论】:

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


    【解决方案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 嵌入的副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2013-05-17
      相关资源
      最近更新 更多