0

Ich versuche, Syntax-Highlighting für CSharp Sprache zu ändern, damit ich Syntaxhervorhebung für SQL in C# Zeichenfolge erhalten. TextMate unterstützt eingebettete Sprachen, daher scheint dies möglich zu sein.TextMate Grammatik - Vorrang von Regeln

Ich baue auf csharp.tmLanguage.json und ich möchte in der Lage sein Embedded SQL mit speziellen Kommentar vor Zeichenfolge zu ermöglichen wie

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

Dank Textmate des Language Grammars und Introduction to scopes ich kam mit dieser JSON Regel nach oben

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

Und dank VSCodes Themes, Snippets and Colorizers und Running and Debugging Your Extension konnte ich testen, dass diese Regel funktioniert.

Aber ich habe ein Problem, das ich nicht lösen kann.

Meine Grammatikregel funktioniert nur, wenn signifficant Teil csharp Regeln deaktiviert sind, wenn ich alle #declarations und #script-top-level, Embedded SQL deaktivieren funktioniert:

enter image description here

Ansonsten meine Regel durch csharp Regeln außer Kraft gesetzt wird, wie

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

enter image description here

Das Problem ist, dass meine Regel mehrere Sprachelemente und die csharp Definition gewinnt diese Elemente auf Targeting arbeitet an.

Auf welcher Basis sind die Elemente markiert? Wie schreibe ich meine Regel, damit sie diese Syntax vor anderen Sprachregeln gewinnt und kennzeichnet? Gibt es einen Algorithmus, um das Gewicht von Regeln zu berechnen?


Lösung

Wenn Sie nicht Kommentarsyntax in csharp kapern können, lässt uns mit Kommentaren in SQL arbeiten. Ich habe eine Regel gemacht, die von -- SQL Kommentar aktiviert wurde, und ich wendete dies auf wörtliche Zeichenfolge an. Jetzt funktioniert es, aber die Stile sind manchmal mit String gemischt. Braucht einige zusätzliche Verbesserungen, sieht aber vielversprechend aus.

enter image description here

Die Regel, die Arbeit beweist, geht so

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

Jetzt würde ich enable Intellisense and error checking in such embedded language mögen.

Antwort

0

Die Regeln in der Musterliste werden der Reihenfolge nach abgeglichen.

Ihre Regel erscheint wie eine Spezialisierung des Kommentars, so können Sie ihn kurz vor den 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" 
        } 
       } 
      }, 
      ... 

Der Schnappschuss auf einer Sprache erfolgt my, die nur eine Kopie von c# json plus Ihre sql Einbettung.

enter image description here