2013-01-18 33 views
3

在OS X上觸發時,我產生用於系統的組的ctags包括使用下面的命令:Vim的自動完成只能當彈出被手動

ctags -f c -h ".h" -R --c-kinds=+p --fields=+iaS --extra=+q /usr/include 

這是的~/.vim/ctags/內運行目錄,我把我爲系統範圍的頭文件生成的所有ctags(我也有用於有條件地加載的ROS和CPP的東西,但這不是在那裏或那裏)。

無論如何。 ctags文件在我的.vimrc中正確設置,vim可以看到ctags,但由於某些原因,如果我寫出整個符號並開始退格,自動完成彈出窗口將僅顯示#include d頭文件的結果。舉個例子,如果我在一個項目中使用#include <string.h>,然後我打電話給strlen(),並且我開始輸入str進入活動的vim緩衝區,那麼我只會得到當前在vim緩衝區中的符號的結果。但是,如果我輸入strlen,然後開始後退一個或兩個字符並擊中<C-n>,則彈出菜單將填充來自其他任何包含的頭文件的匹配項。

編輯:原來,如果我只是擊中「s」然後<C-n>,它也可以。所以這個問題似乎只有在手動啓動彈出式菜單時才起作用。這讓我覺得,這是一個插件的問題(見下文)

其他信息:

  • completeopt設置爲completeopt=menuone,menu,preview,longest

  • 我有OmniCppComplete,我想可能與被幹擾行爲。目前只有而不是被有條件地加載用於C++文件。如果您希望我編輯併發布我的.vimrc中的OmniCppComplete設置,只需詢問。

  • 我也有AutoComplPop安裝,但我沒有做任何事情來配置它,所以它的默認設置運行。還沒有真正研究這個插件,所以不知道它的一些行爲是否會干擾結果。

  • 我已經安裝了AutoTagTagBar,但這些應該只是擺弄當前目錄的本地標記文件。

我老老實實相當新的Vim的,我只是不知道從哪裏開始調試這個問題,無論是用隨機插件或我的.vimrc設置。

回答

3

Vim有許多特定的完成機制。

  • <C-n><C-p>使用由complete選項定義許多來源。默認情況下,它們將使用當前和所有加載和卸載的緩衝區,標記和包含文件提供完成。雖然通常可以通過這些建議獲得相當有用的建議,但這是一種「全面解決方案」解決方案:如果您在合理的大型項目上工作,則完全不可靠。

  • 使用只有標籤,以便它可以一點對你更有用。

  • 還有更多,請參閱:h ins-completion

  • Omni完成更聰明:它通常會運行一個自定義文件類型特定的腳本,它會盡力提供有意義的完成。它由<C-x><C-o>觸發,你可以在:h ft-c-omni中閱讀。使用代碼時,Omni完成通常是更好的選擇。

因爲你有兩個重疊的「自動」完成插件,很難說什麼完成機制在工作。您應該禁用這些插件並使用可用的不同完成機制。

+0

此問題似乎是AutoComplPop沒有爲C和C++文件定義的內置行爲,並且無論如何,它都回退到使用''。 ''當我在C文件中使用它時,會返回一個找不到模式的錯誤,所以現在我只是禁用AutoComplPop並使用''來得到最小的特定結果。我將不得不做更多的研究和試驗。感謝您指點我正確的方向! –

+0

''調用一個你沒有的自定義函數,因此出錯。我也使用ACP。它不支持JavaScript,所以我修改了它。實際上,即使對於那時候的noob,也很容易。看到[這裏](https://github.com/romainl/dotvim/blob/master/bundle/autocomplpop/plugin/acp.vim#L33)和其他地方。 – romainl

+0

感謝您的鏈接。我得到''的錯誤,但我仍然認爲這意味着在我的vim運行時中不存在響應C文件中給定模式的函數。不過,我會看看如果我不能基於配置來擺弄AutoComplPop。看起來很瑣碎。我唯一的問題是,你是如何創建'acp#meetsForJavaScriptOmni'?我瞭解的其他一切。 –

0

我還沒有掌握這一點,但我認爲下面的觀察可能有幫助。

Vim的默認自動完成可能會非常嘈雜,經常妨礙您撥打<C-x><C-o>。具體來說,我發現自己調用基於<C-x><C-o>的基於完成的標記,只讓替換爲,繼續使用我的打開緩衝區鍵入Vim的默認建議。

關閉其中一個插件的建議很有意義。在我的情況下,關鍵是如何關閉Vim的默認行爲。我見過幾個人(現在我已經包括了自己),在觸發Vim的默認設置之前,將表達式的長度設置爲很高的數字。對我來說,那就是:

let g:deoplete#auto_complete_start_length = 99 

...這樣可以消除落成的默認層來來去去,無論你打算告訴你的工作的命令。

這仍然感覺像是黑客,但它有助於我的工作集中在基於標記的完成。

僅供參考:我在Mac上使用NVIM。