我試圖修改CSharp語言的語法高亮顯示,所以我將在C#字符串中爲SQL獲取語法高亮顯示。 TextMate支持嵌入式語言,所以這似乎是可能的。TextMate語法 - 規則的優先級
我建立在csharp.tmLanguage.json,我希望能夠實現與字符串之前,特殊的註釋嵌入式SQL像
string query = /*SQL*/ [email protected]"SELECT something FROM ..."
由於TextMate的Language Grammars和Introduction 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 Colorizers和Running and Debugging Your Extension我能夠測試,這個規則的工作原理。
但我有一個問題,我無法解決。
我的語法規則僅適用如果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。