As for {
,}
and [
,]
and (
, )
,我真的希望能够定义syntax region
for <
, >
用于 C++ 模板使用,如下所示:
a<b>
但是,有没有什么方法可以创建这样的语法区域而不与以下内容发生冲突:
if( a < b<c>::d )
首先<
显然是一个“小于”运算符,并且应该作为模板参数区域的开始而被丢弃。
我尝试过使用多种选项,但无法使其发挥作用。尝试使用复杂的正则表达式来识别模板参数区域而不是小于操作似乎确实是不可能的,它只能通过使用嵌套自引用模式检查平衡对来工作。
根据 @ingo-karkat 的回答,我对空格的使用进行了进一步的思考,我认为我得到了一个足够好的匹配模式,对此感到满意(我认为这捕获了 90% 以上的情况)。
syn region AngleBrackets matchgroup=AngleBracketContents
start='[[:space:]<]\@<!<<\@!'
end='>'
start
火柴<
那不是preceded通过空格或<
。检查是否存在preceded空格是一个关键因素,因为大多数时候关系运算都会被空格包围,而且,很常见的做法是不在模板左括号之前加上空格。
我还检查它是否没有立即跟随另一个<
.
这是一个快照我在做什么 https://github.com/oblitum/rainbow(区域内的运算符获取区域的颜色,嵌套区域改变颜色,它基于彩虹括号构建,经过一些细微的修正改进):
UPDATE
刚刚将我的 VIM 正则表达式更改为:
\v%(<operator\_s*)@<!%(%(\_i|template\_s*)@<=\<[<=]@!|\<@<!\<[[:space:]<=]@!)
最后一个实际上将帮助我强化良好的代码风格。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)