在VIM中,有没有办法为模板尖括号定义syn区域而不会与小于符号冲突?

时间:2012-11-29 14:07:19

标签: vim vim-syntax-highlighting

关于{}[](),我真的希望能够定义syntax region的{​​{1}},<用于C ++模板的使用,如下所示:

>

但是,有没有办法创建这样一个语法区域,而不会与以下内容发生冲突:

a<b>

第一个if( a < b<c>::d )显然是“小于”运算符,应该作为模板参数区域的开头被丢弃。

我尝试过使用多种选项但无法使其正常运行。尝试使用复杂的正则表达式来识别模板args区域而不是一个小于操作似乎是不可能的,它只能通过使用嵌套的自引用模式检查平衡对来起作用。

2 个答案:

答案 0 :(得分:4)

根据@ ingo-karkat的回答,我对空白使用情况有了进一步的了解,我认为我有一个足够好的匹配模式可以满足(我认为这可以捕获90%以上的情况)。

syn region AngleBrackets matchgroup=AngleBracketContents 
start='[[:space:]<]\@<!<<\@!'
end='>'

start匹配{<1}} 之前的空格和<。通过空格检查是否 是一个关键因素,因为大多数时候关系操作都会被空格包围,而且,很常见的做法是不在模板之前用空格打开括号。

我还检查是否有其他<没有立即跟进。

这是what I'm doing的快照(区域内的操作符获取区域的颜色,嵌套区域改变颜色,它基于Rainbow括号改进,带有一些小的修正):

VIM snapshot

更新

刚刚将我的VIM正则表达式更改为:

<

这最后一个实际上将帮助我强制执行良好的代码风格。

答案 1 :(得分:1)

只要你拍摄 80%解决方案并将<...>内的文本限制为非空白标识符(假设你的编码风格用空格围绕比较运算符),使用:syntax match代替:syntax region(已经在开始匹配时触发,而不检查是否存在结束匹配),这应该有效(因为单个正则表达式必须匹配开始和结束)。 / p>

关于解析C ++(在真正的编译器中)的困难已经说了很多,所以不要指望使用正则表达式的通用解析解决方案是完美的。 (另外,不要忘记语法突出显示只是一个视觉援助,你不应该过分依赖它。)