Vim 中使用 OmniComplete 爲 C/C++ 自動補全(部分增長)

對原文作了部分修改及增長,原文地址http://timothyqiu.com/archives/using-omnicomplete-for-c-cplusplus-in-vim/ php


OmniComplete 並非插件的名字,而是 Vim 衆多補全方式中的一種(全能補全)。說白了 OmniComplete 其實就是根據光標前的內容猜想光標後的內容,具體怎麼猜取決於所採用的腳本。 html

而 OmniCppComplete 就是專爲 C/C++ 編寫的 OmniComplete 一個補全腳本。 python

那麼常常和 OmniCppComplete 一塊兒出沒的 Ctags 又是什麼呢?Ctags 全名 Exuberant Ctags,是一個獨立的程序(也就是說,其實和 Vim 一點關係都沒有)。它能夠爲各類語言的源代碼生成語言元素(language object)索引文件。對於 C/C++ 來講,就是把源代碼中的各類宏、函數、類、類成員等等元素和它們的相關信息生成索引文件,供其它程序使用。 c++

OmniCppComplete 腳本就是根據 Ctags 生成的索引文件進行補全的。 好了,背景知識就是這樣,安裝步驟以下: shell

安裝 Ctags

通常ctags 都是默認安裝過的,fedora下能夠用yum list ctags,查看是否安裝 vim

  1. 從官網下載 Ctags 可執行文件,網站是 http://ctags.sourceforge.net/
  2. 將下載到的文件(僅 EXE 文件便可)解壓到一個目錄,例如 D:/ctags
  3. 將該目錄加入環境變量 PATH


準備索引文件

以生成 C++ 標準庫索引文件爲例: curl

  1. 下載專爲 Ctags 修改過的 libstdc++ 頭文件
  2. 將其解壓到一個目錄,例如 D:/ctags/cpp_src
  3. 使用命令行進入 D:/ctags/cpp_src 後執行: 函數

    ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f cpp .
  4. 建議將上一步生成的 D:/ctags/cpp_src/cpp 文件放到一個專門放置索引文件的目錄以便後面的統一設置,例如放到 D:/ctags/tags 網站

其它庫的索引文件也能夠依法炮製,只需切換到該庫的 include 文件夾,執行: ui

ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f <文件名> .
添加openGL
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ /usr/include/GL

修改爲對應tags
mv tags gl


fedora17 的$HOME下沒有.vim文件夾,建立一個就能夠了,vim會自動加載的。

可是也能夠設置成全局的,對全部用戶有效,就是吧~/.vim 替換成 $VIM/vimfiles

$VIM/vimfiles:功能同上,不過是對全部用戶均有效的。

VIM 插件通常安裝在 5 個地方,存放插件的路徑都列在「runtimepath」選項中,咱們能夠使用 set 命令查看它:

:set runtimepath?

顯示結果以下:

  runtimepath=~/.vim,/usr/local/share/vim/vimfiles,/usr/local/share/vim/vim63,/u
sr/local/share/vim/vimfiles/after,~/.vim/after

Unix 下的 $HOME/.vim 或 Windows 下的 %HOME%/vimfiles:用戶自定義腳本及插件。該目錄下的腳本會在系統腳本加載前執行,用於擴展與替代系統腳本原有功能。

$VIM/vimfiles:功能同上,不過是對全部用戶均有效的。

$VIMRUNTIME:隨 VIM 一同發行的插件與腳本。不要在這裏存放你本身下載或安裝的文件,升級 VIM 的時候,這裏的文件極可能被直接覆蓋掉,不會給出任何提示信息。

Unix 下的 $HOME/.vim/after 或 Windows 下的 %HOME%/vimfiles/after:用於對已有設置進行一些小的修正和覆寫。

$VIM/vimfiles/after:對全部用戶均有效的一些全局設置修正腳本。

以上路徑都是使用「VIM 語言」給出的,通常狀況下,$VIMRUNTIME 都不會被定義爲系統環境變量,$VIM 在少數狀況下會在 VIM 以外被定義。若是你想知道這些路徑都是什麼,能夠在 VIM 中使用「:echo $VIMRUNTIME」或「:echo $VIM」。

以上提到的 5 個目錄的子目錄結構都是相同的。若是你但願在其它目錄裏安裝插件的話,建議使用 $VIMRUNTIME 的目錄結構做爲模版,將必要的目錄結構建立完整,像這樣:

+ <Directory>
  +  colors
  +  compiler
  +  doc
  +  etc
  +  ftdetect
  +  ftplugin
  +  indent
  +  keymap
  +  plugin
  +  syntax


安裝 OmniCppComplete

  1. 下載 OmniCppComplete
  2. 將下載到的文件解壓到 ~/.vim (unix) 或者 %HOMEPATH%\vimfiles (Windows) 文件夾
  3. 在 vimrc 文件中加入

    其中「表示註釋

    " ctags 索引文件 (根據已經生成的索引文件添加便可, 這裏我額外添加了 hge 和 curl 的索引文件)
    set tags+=D:/ctags/tags/cpp
    set tags+=D:/ctags/tags/hge
    set tags+=D:/ctags/tags/curl
    " OmniCppComplete
    let OmniCpp_NamespaceSearch = 1
    let OmniCpp_GlobalScopeSearch = 1
    let OmniCpp_ShowAccess = 1
    let OmniCpp_ShowPrototypeInAbbr = 1 " 顯示函數參數列表
    let OmniCpp_MayCompleteDot = 1   " 輸入 .  後自動補全
    let OmniCpp_MayCompleteArrow = 1 " 輸入 -> 後自動補全
    let OmniCpp_MayCompleteScope = 1 " 輸入 :: 後自動補全
    let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
    " 自動關閉補全窗口
    au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
    set completeopt=menuone,menu,longest

另外,還需確認在 vimrc 中開啓了 filetype 選項,否則 OmniComplete 沒法自動識別 C/C++ 文件類型進行補全。

這樣,在插入模式編輯 C/C++ 源文件時按下 . 或 -> 或 ::,或者手動按下 Ctrl+X Ctrl+O 後就會彈出自動補全窗口,此時能夠用 Ctrl+N 和 Ctrl+P 上下移動光標進行選擇。

美化咩?

也許你也已經注意到了一個問題,那就是「自動補全窗口的配色很是之醜」,Vim 自帶的幾個配色方案中只有兩三種配色改掉了自動補全窗口醜陋的紫色,其它的基本上都是很逆天的用灰色表示當前選中項、紫色表示其餘項。

要改變自動補全窗口的配色能夠在 vimrc 中加上:

highlight Pmenu    guibg=darkgrey  guifg=black
highlight PmenuSel guibg=lightgrey guifg=black

Pmenu 是全部項的配色,PmenuSel 是選中項的配色,guibg 和 guifg 分別對應背景色和前景色。


ps:tab鍵 設置爲4個空格,設置tab寬度

爲了vim更好的支持python寫代碼,修改tab默認4個空格有兩種設置方法:

1. vim /etc/vimrc 

1 set ts=4
2 set sw=4

2. vim /etc/vimrc 

1 set ts=4
2 set expandtab
3 set autoindent

推薦使用第二種,按tab鍵時產生的是4個空格,這種方式具備最好的兼容性。 

from:

http://my.oschina.net/renwofei423/blog/17338
相關文章
相關標籤/搜索