我正在尝试修改CSharp语言的语法高亮,因此我将在C#string中获得SQL的语法高亮。 TextMate支持嵌入式语言,所以这似乎是可能的。
我在csharp.tmLanguage.json上构建,我希望能够在字符串之前启用带有特殊注释的嵌入式SQL
string query = /*SQL*/ $@"SELECT something FROM ..."
感谢TextMate的Language Grammars和Introduction to scopes我想出了这个JSON规则
"repository": {
"embeded-sql": {
"contentName": "source.sql",
"begin": "/\\*\\s*SQL\\s*\\*/\\s*\\$?@?\"",
"end": "\";",
"patterns": [
{
"include": "source.sql"
}
]
},
...
}
感谢VSCode的Themes, Snippets and Colorizers和Running and Debugging Your Extension我能够测试,这个规则有效。
但我有一个问题,我无法解决。
我的语法规则只有在禁用csharp规则的重要部分时才有效,如果我禁用所有#declarations
和#script-top-level
,则嵌入式SQL工作:
否则,我的规则被csharp规则覆盖,如
问题是,我的规则适用于多个语言元素,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。
答案 0 :(得分: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
嵌入的副本。