至于{
, }
和 [
, ]
和 (
, )
,我真的很想能够定义 syntax region
为 <
, >
用于 C++ 模板用法,如下所示:a<b>
但是,有什么方法可以创建这样的语法区域,而不会与以下内容发生冲突:if( a < b<c>::d )
第一个<
显然是一个“小于”运算符,并且应该作为模板参数区域的开始而被丢弃。
我尝试使用多个选项,但无法使其正常工作。尝试使用复杂的正则表达式来识别模板 args 区域而不是小于操作似乎真的是不可能的,它只能通过使用嵌套的自引用模式检查平衡对来工作。
最佳答案
基于@ingo-karkat 的回答,我进一步考虑了空格的使用,并且我认为我得到了一个足够好的匹配模式来满意(我认为这捕获了 90% 以上的情况)。
syn region AngleBrackets matchgroup=AngleBracketContents
start='[[:space:]<]\@<!<<\@!'
end='>'
start
匹配 <
前面没有空格也没有 <
.检查是否存在 之前 by 空格是一个关键因素,因为大多数时候关系操作都会被空格包围,而且非常常见的做法是不要在模板左括号之前使用空格。我还检查它是否没有立即被另一个
<
跟随.这是 what I'm doing 的快照(区域内的操作符获得区域的颜色,嵌套区域改变颜色,它建立在彩虹括号的基础上,并进行了一些小幅修正):
更新
刚刚将我的 VIM 正则表达式更改为:
\v%(<operator\_s*)@<!%(%(\_i|template\_s*)@<=\<[<=]@!|\<@<!\<[[:space:]<=]@!)
最后一个实际上将帮助我实现良好的代码风格。
关于vim - 在 VIM 中,有什么方法可以为模板尖括号定义 syn 区域而不与小于号发生冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627544/