Vim语法高亮 - 从模式中排除特定文本

Wil*_*son 5 regex vim vim-syntax-highlighting

我已经定义sqlVariablesqlString在我的语法文件中

syn match   sqlVariable ":[a-z][a-z0-9_#$]*"
syn region  sqlString   start=+'+ end=+'+ contains=sqlVariable
Run Code Online (Sandbox Code Playgroud)

(加上一些其他的引用变体.)字符串可以包含sqlVariable,以突出动态代码中的绑定,如:b1in 'select a from b where c = :b1'.(这适用于Oracle顺便说一句.)

这一切都很好 - 除了包含冒号的日期格式掩码的特定烦人情况,例如

to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

:MI和:SS被突出显示为变量,因为它们当然与我的模式匹配.

有没有办法:MI和:SS sqlVariable在引用的字符串中不匹配?(我认为只有这两种情况才会这样做.)

Ken*_*ent 1

这有帮助吗?

syn match sqlVariable ":[a-z][a-z0-9_#$]*\ze\(\s\|'$\)"
Run Code Online (Sandbox Code Playgroud)

:foo如果它们后面跟着空格或'EOL( ) ,它将匹配它们$

所以,:a1 :b1 and :c1将被匹配:

'select * from foo where a= :a1 and b=: b1 and c = :c1'
Run Code Online (Sandbox Code Playgroud)

但没有匹配:

to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

如果没有,也许你可以重新考虑一下这个region定义。