2013-04-24 75 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