私はCSharp言語の構文ハイライトを変更しようとしていますので、C#の文字列でSQLの構文をハイライト表示します。 TextMateは埋め込み言語をサポートしているので、これは可能です。TextMate文法 - ルールの優先度
私は、このJSONルール
"repository": {
"embeded-sql": {
"contentName": "source.sql",
"begin": "/\\*\\s*SQL\\s*\\*/\\s*\\[email protected]?\"",
"end": "\";",
"patterns": [
{
"include": "source.sql"
}
]
},
...
}
を思い付いたのTextMateの
Language Grammarsと
Introduction to scopesのおかげで、私は
csharp.tmLanguage.json上に構築し、私は
string query = /*SQL*/ [email protected]"SELECT something FROM ..."
のような文字列の前に特別なコメントで埋め込みSQLを有効にできるようにしたいと思います
VSCodeのThemes, Snippets and ColorizersとRunning and Debugging Your Extensionのおかげで、このルールが機能することをテストできました。
しかし、私は解決できない1つの問題があります。
私の文法規則は、CSHARPルールのsignifficant部分は、無効になっている私はすべての#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したいと思います。