我正在使用VScode并创建自己的语言扩展以突出语法,在这里我需要使用正则表达式来查找注释。
基本规则是!
之后的所有内容均为注释,但是有特殊情况。当!
位于eval()
命令中时,表示不可以。
例如,我的一些代码如下:
if condition=(eval(!DB_EXIST)) ! this is a comment
(eval( !DB_UPDATED && !DB_EXIST)) !---"!" inside eval() means NOT
!this is another comment
<some commands> ! this is also a comment
第1行和第2行中的!DB_EXIST
不应被解释为注释,并且!
之后将是一个非空格。
空格在注释中无关紧要。
"comments": {
"patterns" [{
"match":"regex1",
"name":"comment"
}]
},
"operator": {
"patterns" [{
"match":"regex2",
"name":"keyword.operator.NOT"
}]
},
我应该使用哪种正则表达式1和2来显示不同的颜色,而不是注释?
我不擅长此扩展写作,因此,如果有更好的方法来完成这项工作,我将不胜感激。 谢谢!
更新
@ Gama11帮助了我,但我并未在代码示例中完全涵盖所有情况。 “!”之后的任何非空白也应该是注释,只要“!”不在eval()内部。
答案 0 :(得分:3)
这里是一种方法:
{
"$schema": "https://raw.githubusercontent.com/Septh/tmlanguage/master/tmLanguage.schema.json",
"scopeName": "source.abc",
"patterns": [
{
"begin": "(eval)\\(",
"end": "\\)",
"captures": {
"1": {
"name": "entity.name.function"
}
},
"patterns": [
{
"include": "#parens"
},
{
"match": "!",
"name": "keyword"
}
]
},
{
"match": "!.*?$",
"name": "comment"
}
],
"repository": {
"parens": {
"begin": "\\(",
"end": "\\)",
"patterns": [
{
"include": "#parens"
}
]
}
}
}
我们将非注释!
的模式放在第一位,因为它更具体,应该优先于其他注释。另外,我使用了"keyword"
范围而不是更合适的"keyword.operator.NOT"
,因此它实际上在屏幕截图中显示了不同的颜色。
第一个正则表达式是begin
-end
模式,它允许我们仅将模式应用于这两个匹配项之间的文本(在这种情况下,在eval()
calll中)。讨论时,我们不妨将eval
突出显示为具有entity.name.function
范围的函数。
如果我们在eval()
内,则允许两种模式:
begin
-end
模式(包括它自己)来平衡括号(您可能在{{1}中有eval(foo() + !bar())
和)
之类的东西) }不应结束foo()
模式)eval
运算符第二个正则表达式只匹配!
,然后匹配任何内容(!
),直到行尾(.*?
)。
通常,我强烈建议使用regex101.com之类的工具来处理TM语法文件的正则表达式。比起在VSCode本身中进行迭代,要容易得多,因为您可以获得即时反馈。