2013-04-24 56 views
4

我有一个语法高亮的CPP突出STL算法,一条线是Vim的亮点正则表达式

syn keywork cppSTL find 

我的问题是,在我工作的一个项目,有一些类与命名方法find哪些被突出显示,我希望它只在STL调用中突出显示。

所以我决定前行更改为:

syn match cppSTL /[^.>:]\<find\>/ms=s+1 
syn match cppSTL /\<std::find\>/ contains=cppScope 
syn match cppScope /::/ 
hi clear cppScope 

和它的作品大部分时间。但如果在这一行失败:

vector<string>::iterator i = find(find(x.begin(), x.end(), val), x.end(), term); 
            ^^^^ 

第一个find被正确突出显示,但第二个失败。我对vim regex的有限知识表示它应该匹配,但我无法弄清楚它为什么不匹配。

+0

只是踢,尝试:I =找到(...);我= find(...); ...他们都在同一条线上。我很好奇,如果它只是找到每条线上的第一场比赛 – 2013-04-24 19:54:08

+0

@Brian:同一行上的两个调用起作用;我认为这个问题是因为在parentesis里面第二个'find' - 如果我用'(find(...))'''围绕一个调用,突出失败' – Akobold 2013-04-25 14:29:56

回答

0

我明白了!

问题是,我的正则表达式需要一个char后面的查找,而在括号内,左括号已经匹配,使我的正则表达式失效。

它的工作原理,如果我取代第一行以:

syn match cppSTL "[^.>:]\@<=\<find\>" 
2

这可能是你要找的。它突出显示所有在find之前的文字,该文字在其之前也包含::

syn match cppSTL /\(::.*\)\@<=\<find\>/ 

如果这不是你要求的,请告诉我。

+0

这对我不起作用。这会在'util :: s-> find()'中错误地突出显示,并且如果在另一行上声明'i'的类型,将会在该问题的双重查找示例中失败。但它越来越接近我想要的。 – Akobold 2013-04-25 14:26:47

+0

您是否可以添加更多查找应突出显示的案例以及查找不应突出显示的案例? – FDinoff 2013-04-25 14:34:41