0

我試圖修改CSharp語言的語法高亮顯示,所以我將在C#字符串中爲SQL獲取語法高亮顯示。 TextMate支持嵌入式語言,所以這似乎是可能的。TextMate語法 - 規則的優先級

我建立在csharp.tmLanguage.json,我希望能夠實現與字符串之前,特殊的註釋嵌入式SQL像

string query = /*SQL*/ [email protected]"SELECT something FROM ..." 

由於TextMate的Language GrammarsIntroduction to scopes我想出了這個JSON規則

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

並感謝VSCode的Themes, Snippets and ColorizersRunning and Debugging Your Extension我能夠測試,這個規則的工作原理。

但我有一個問題,我無法解決。

我的語法規則僅適用如果CSHARP規則signifficant部分是殘疾人,如果我禁用所有#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

回答

0

模式列表中的規則按順序匹配。

你的規則看起來像註釋的一個特例,所以你可以把它僅僅是comment.block.cs

"comment": { 
     "patterns": [ 
      { 
       "contentName": "source.sql", 
       "begin": "(/\\*\\s*SQL\\s*\\*/)\\s*\\[email protected]?\"", 
       "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