2011-04-28 43 views
6

我有omnicppcomplete工作正常,除非偶爾它不會完成一些變量方法/成員。我終於惱火到足以深究爲什麼,我相信原因是omnicppcomplete在函數參數中支持語法「Foo const & foo」。omnicppcomplete不支持所有形式的const

舉例來說,如果我有一個函數定義爲:

int foo(Bar const & b){ 
} 

我將無法獲得完成信息時,我後來鍵入「B」。但是,如果我將簽名更改爲:

int foo(const Bar & b){ 
} 

當我鍵入「b。」時,我將能夠獲得完成信息。它似乎只在函數參數列表中,因爲我嘗試在函數中用簽名「Bar const & bref」簡單地定義一個變量,並且我能夠獲得bref的完成信息。

如果這是omnicppcomplete的實際限制,我會感到驚訝;任何人有任何想法,這是否是一個錯誤和/或如果有解決方法嗎?改變編碼風格似乎不是一個合理的解決方案。

+0

哇,這是跛腳!特別是因爲前者是更一致的語法(儘管當然嚴格來說後者並非不正確)。 – 2011-06-20 18:25:06

回答

3

似乎omnicppcomplete中的限制,但我拉起了vim調試器,發現它。

打開自動加載/全/ CPP/utils.vim,轉到行518,應該是這樣的:

for token in tokens 
     if state==0 
      if token.value=='>' 
       let parenGroup = token.group 
       let state=1 
      elseif token.kind == 'cppWord' 
       let szResult = token.value.szResult 
       let state=2 
      elseif index(['*', '&'], token.value)<0 "This is line 518 
       break 
      endif 

,並更改該行:

elseif token.value != 'const' && index(['*', '&'], token.value)<0 

或者,這裏的Vim命令做=):

/index(\['\*', '&'],<CR>itoken.value != 'const' &&<ESC>:w 

我會嘗試提交這omnicppcomplete的維護者,但它是一種的hackish,不知道它是否會進來。可能已經能夠檢查是否token.kind =='cppKeyword',但我想我會改變最少的一方。

+0

非常感謝,我已經放棄了希望任何人回答。 在不相干的筆記上,賞金是否引誘你以某種方式尋找。我從來沒有想過這種賞金是有用的。這是它第一次運作。更多的是因爲我的好奇心。 – 2011-06-24 20:42:39

+0

我不認爲這個獎金對我來說真的很重要,但它確實讓問題出現在C++的特色問題列表中,這就是我看到它的地方。不過,這是一個不錯的振作。 =)謝謝! – Xepo 2011-06-24 20:44:06

2

遇到omnicppcomplete問題,我搜索了一個替代方法,找到clang complete,它使用了clang的元數據輸出(專門用於這種目的)。我工作得非常好,並提供了您的代碼編譯,它會理解一切。

+0

是的,我看到了鐺完成,但不幸的是,我沒有在我的所有開發服務器上訪問鐺... – 2011-05-24 17:22:18