vi/vim使用進階: 智能補全

來源:互聯網
上載者:User

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使用進階: 指隨意動,移動如飛 (二)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.