http://easwy.com/blog/archives/advanced-vim-skills-omin-complete/
<< 返回vim使用進階: 目錄
本節所用命令的協助入口:
:help ins-completion:help compl-omni:help 'omnifunc':help i_CTRL-X_CTRL-O:help ins-completion-menu:help popupmenu-keys:help 'completeopt':help compl-omni-filetypes:help omnicppcomplete.txt
使用過Source Insight的人一定對它的自動補全功能印象深刻,在很多的整合式開發環境中,也都支援自動補全。vim做為一個出色的編輯器,這樣的功能當然少不了。而 且,作為一個通用的編輯器,vim實現的補全功能並不僅僅限於對程式的補全,它可以對檔案名稱補全、根據字典進行補全、根據本緩衝區或其它緩衝區類似的內容 進行補全、根據檔案文法補全等等,它甚至允許使用者自己編寫函數來實現定製的補全。
作為vim進階系列文章中的一篇,本文以介紹vim對程式的補全為主,也順帶介紹一下其它的補全方式。本文將分為兩篇,第一篇主要介紹vim的OMNI補全,下一篇簡要介紹其它的補全方式,以及SuperTab外掛程式。
vim的OMNI補全(以下稱”全能補全”)可以支援多種程式語言,包括C,C++, XML/HTML,CSS,JAVASCRIPT,PHP,RUBY等,詳細列表請參閱”:help compl-omni-filetypes“。在本文中,主要介紹C及C++的全能補全。
vim在對不同類型的檔案進行補全時,會根據檔案類型,為其設定不同的補全函數。也就是說,要實現全能補全功能,需要開啟檔案類型檢測。把下面的命令加到你的vimrc中:
filetype plugin indent on
你可以查看’omnifunc‘選項,來知道當前的補全函數是什麼。
對C及C++代碼的全能補全需要使用Exuberant ctags產生的標籤檔案,我們在前面的文章中介紹過如何使用Exuberant ctags程式來產生標籤檔案。不過,如果你的Exuberant ctags版本為5.5.4,那麼需要為其打上增加”typename:“欄位補丁,才能支援C的全能補全。補丁在這裡下載:
ftp://ftp.vim.org/pub/vim/unstable/patches/ctags-5.5.4.patch
可以在這裡找到MS-Windows上已經編譯好的可執行版本:
http://georgevreilly.com/vim/ctags.html
不過我建議使用最新5.6版本Exuberant Ctags。在下面的網站可以下載:
http://ctags.sourceforge.net/
你可以直接下載已經編譯好的rpm版本,或者下載原始碼。如果是後者,使用以下命令對原始碼進行編譯:
tar zvxf ctags-5.6.tar.gzcd ctags-5.6./configuremakemake install
如果你沒有系統目錄的寫入權限,你可能要把Exuberant Ctags安裝到自己的主目錄,只需要把上面的”./configure“命令改為”./configure –prefix=/home/xxx“就可以了。
Ctags升級後,使用”ctags –R“更新一下標籤檔案,現在再進入vim就可以在C程式中全能補全了。我們依舊以vim 7.0的原始碼為例。
例如,我們在VimMain()函數中,輸入”gui“三個字元,然後按下”CTRL-X CTRL-O“,在vim的狀態行會顯示”Omni Completeion“,表明現在進行的是全能補全,同時會彈出一個下拉式功能表,顯示所有匹配的標籤。你可以使用來”CTRL-P“和”CTRL-N“上下選擇,在選擇的同時,所選中的項就被放在游標位置,不需要再按斷行符號來把它放在游標位置(像Source Insight那樣)。
如果更習慣於使用Source Insight這種方式,你可以使用上、下游標鍵來選擇項目,然後按斷行符號把選中的項目放到游標位置。不過這樣一來,你的手指就會離開主編輯區,並且需要多輸入一個斷行符號鍵。
本文結尾處提供了一個鍵綁定,允許在使”CTRL-P“和”CTRL-N“時,輸入斷行符號表示補全結束,而不是插入斷行符號。
如果補全處於啟用狀態,可以用”CTRL-E“停止補全並回到原來錄入的文字。用”CTRL-Y“可以停止補全,並接受當前所選的項目。
點擊查看大圖
是使用”CTRL-N”選擇的抓圖。該圖中,我選擇了”gui_exit(“函數,接下來可以直接輸入這個函數的參數,這會結束當前補全,並插入我所輸入的參數。
點擊查看大圖
是對結構的成員進行補全的抓圖:
點擊查看大圖
預設的,vim會使用下拉式功能表和一個preview視窗(預覽視窗)來顯示匹配項目,下拉式功能表列出所有匹配的項目,預覽視窗則顯示選中項目的詳細資料。開啟預覽視窗會導致下拉式功能表抖動,因此我一般都去掉預覽視窗的顯示,這需要改變’completeopt‘的值,我的設定如下:
set completeopt=longest,menu
上面的設定表明,只在下拉式功能表中顯示匹配項目,並且會自動插入所有匹配項目的相同文本。
如果要支援C++的全能補全,需要到vim首頁下載OmniCppComplete外掛程式,連結如下:
http://www.vim.org/scripts/script.php?script_id=1520
下載後,把它解壓到你的.vim目錄(在windows下是vimfiles目錄),它會安裝以下檔案:
after\ftplugin\cpp.vimautoload\omni\common\debug.vim\utils.vimautoload\omni\cpp\complete.vim\includes.vim\items.vim\maycomplete.vim\namespaces.vim\settings.vim\tokenizer.vim\utils.vimdoc\omnicppcomplete.txt
確保你已關閉了vi相容模式,並允許進行檔案類型檢測:
set nocpfiletype plugin on
接下來,使用下面的命令,為C++檔案產生標籤檔案,假定你的檔案在src分類樹下:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src
在對C++檔案進行補全時,OmniCppComplete外掛程式需要tag檔案中包含C++的額外資訊,因此上面的ctags命令不同於以前我們所使用的,它專門為C++語言產生一些額外的資訊,上述選項的含義如下:
--c++-kinds=+p : 為C++檔案增加函數原型的標籤--fields=+iaS : 在標籤檔案中加入繼承資訊(i)、類成員的存取控制資訊(a)、以及函數的指紋(S)--extra=+q : 為標籤增加類修飾符。注意,如果沒有此選項,將不能對類成員補全
現在,進入vim,設定好tag選項(我在前面的文章中介紹過)。好極了,vim能夠對C++自動補全了!
我寫了一個簡單的例子,來示範C++的自動補全功能,如所示,在輸入”t.“後,OmniCppComplete外掛程式會自動彈出struct test1的成員供選擇,而在輸入”b->“後,又會自動彈出class base的成員供選擇,非常方便,連”CTRL-X CTRL-O“都不必輸入。OmniCppComplete外掛程式的預設設定比較符合我的習慣,因此不須對其設定進行調整,如果你需要調整,參閱OmniCppComplete的協助頁。
點擊查看大圖點擊查看大圖
下表是我的vimrc中設定的鍵綁定,使用pumvisible()來判斷下拉式功能表是否顯示,如果下拉式功能表顯示了,鍵映射為了一個值,如果未顯示,又會映射為另一個值。
" mappinginoremap <expr> <CR> pumvisible()?"\<C-Y>":"\<CR>"inoremap <expr> <C-J> pumvisible()?"\<PageDown>\<C-N>\<C-P>":"\<C-X><C-O>"inoremap <expr> <C-K> pumvisible()?"\<PageUp>\<C-P>\<C-N>":"\<C-K>"inoremap <expr> <C-U> pumvisible()?"\<C-E>":"\<C-U>"
上面的映射都是在插入模式下的映射,解釋如下:
- 如果下拉式功能表彈出,斷行符號映射為接受當前所選項目,否則,仍映射為斷行符號;
- 如果下拉式功能表彈出,CTRL-J映射為在下拉式功能表中向下翻頁。否則映射為CTRL-X CTRL-O;
- 如果下拉式功能表彈出,CTRL-K映射為在下拉式功能表中向上翻頁,否則仍映射為CTRL-K;
- 如果下拉式功能表彈出,CTRL-U映射為CTRL-E,即停止補全,否則,仍映射為CTRL-U;
在下一篇文章中,將繼續介紹vim提供的其它補全方式。
[參考文檔]
- vim手冊
- vim中文手冊
- http://www.vim.org/tips/tip.php?tip_id=1228
- http://www.vim.org/tips/tip.php?tip_id=1386
<< 返回vim使用進階: 目錄
原創文章,請閱讀頁尾的許可方式,轉載請註明:轉載自易水部落格 [ http://easwy.com/blog/ ]
本文連結地址: http://easwy.com/blog/archives/advanced-vim-skills-omin-complete/
文章的腳註資訊由WordPress的wp-posturl外掛程式自動產生
相關文章
- vi/vim使用進階: 自動補全
- vi/vim使用進階: 使用標籤(tag)檔案
- vi/vim使用進階: vim編譯中遇到的問題及解決方案
- vi/vim使用進階: 程式員的利器 – cscope
- vi/vim使用進階: lookupfile外掛程式
- vi/vim使用進階: 在VIM中使用GDB調試 – 使用vimgdb
- vi/vim使用進階: 使用taglist外掛程式
- vi/vim使用進階: 指隨意動,移動如飛 (二)