轉自http://blog.csdn.net/duguteng/article/details/7417181#t4
vim自動補齊插件onmicppcompete
『插件介紹』
onmicppcompete功能:
- 命名空間(namespace),類(class),結構(struct)和聯合(union)補全
- 函數屬性成員和返回值類型補全
- "this"指針成員補全
- C/C++類型轉換(cast)對象補全
- 類型定義(typedef)和匿名類型(anonymous types)補全
按理說可以顯示函數原型,但是我的不可以,不知道為什么?
有圖有真相:
『下載和安裝』
從http://www.vim.org/scripts/script.php?script_id=1520下載安裝包后。
1)進入~/.vim目錄,將安裝版解壓縮
2)進入~/.vim/doc目錄,在Vim命令行下運行"helptags .”(注意有個點)
3)在~/.vimrc中加入以下幾行:
- set nocp
- filetype plugin on
4)啟動Vim后使用以下命令為Vim添加omnicppcomplete幫助信息
- :helptags ~/.vim/doc
5)使用ctags生成標簽庫
對於C++代碼,需要在~/.ctags 中加入下面幾個選項(去除中文):
- --c++-kinds=+p : 為標簽添加函數原型(prototype)信息
- --fields=+iaS : 為標簽添加繼承信息(inheritance),訪問控制(access)信息,函數特征(function Signature,如參數表或原型等)
- --extra=+q : 為類成員標簽添加類標識
6)參數配置(可選)
在 vimrc 文件中加入
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
分別對應背景色和前景色。
至此,安裝結束!
『基本功能使用方法』
在配置好Vim,並生成了ctags標簽庫前提條件下,Vim中在輸入 “xxx." 或者 "xxx->" 時會彈出如下補全提示:
- +-------------------------------------+
- |method1( f + MyNamespace::MyClass|
- |_member1 m + MyNamespace::MyClass|
- |_member2 m # MyNamespace::MyClass|
- |_member3 m - MyNamespace::MyClass|
- +-------------------------------------+
- ^ ^ ^ ^
- (1) (2)(3) (4)
其中1為符號名稱;2為符號類型;3為訪問控制標識;4為符號定義所在域(scope)。
符號名稱
1為omnicppcomplete所查找到的可選符號(symbol)名稱,如以'('結尾,則為函數。
按理說可以顯示函數的原型,但是我的不可以,不知道為什么?
符號類型
符號的類型,可能的值為
- c : 類(class)
- d : 宏(macro definition)
- e : 枚舉值(enumeator)
- f : 函數(function)
- g : 枚舉類型名稱
- m : 類/結構/聯合成員(member)
- n : 命名空間(namespace)
- p : 函數原型(function prototype)
- s : 結構體名稱(structure name)
- t : 類型定義(typedef)
- u : 聯合名(union name)
- v : 變量定義(variable defination)
訪問控制
類成員訪問控制,取值:
- + : 公共(public)
- # : 保護(protected)
- - : 私有(private)
符號定義所在域
符號在何處被定義。
『常用配置選項』
Vim中,可以通過以下選項控制omnicppcomplete查找/補全方式:
- OmniCpp_GlobalScopeSearch : 全局查找控制。0:禁止;1:允許(缺省)
- OmniCpp_NamespaceSearch : 命名空間查找控制。
- 0 : 禁止查找命名空間
- 1 : 查找當前文件緩沖區內的命名空間(缺省)
- 2 : 查找當前文件緩沖區和包含文件中的命名空間
- OmniCpp_DisplayMode : 類成員顯示控制(是否顯示全部公有(public)私有(private)保護(protected)成員)。
- 0 : 自動
- 1 : 顯示所有成員
- OmniCpp_ShowScopeInAbbr : 選項用來控制匹配項所在域的顯示位置。缺省情況下,omni顯示的補全提示菜單中總是將匹配項所在域信息顯示在縮略信息最后一列。
- 0 : 信息縮略中不顯示匹配項所在域(缺省)
- 1 : 顯示匹配項所在域,並移除縮略信息中最后一列
- OmniCpp_ShowPrototypeInAbbr : 是否是補全提示縮略信息中顯示函數原型。
- 0 : 不顯示(缺省)
- 1 : 顯示原型
- OmniCpp_ShowAccess : 是否顯示訪問控制信息('+', '-', '#')。0/1, 缺省為1(顯示)
- OmniCpp_DefaultNamespaces : 默認命名空間列表,項目間使用','隔開。
如:let OmniCpp_DefaultNamespaces = ["std', "MyNamespace"] - OmniCpp_MayCompleteDot : 在'.'號后是否自動運行omnicppcomplete給出提示信息。0/1, 缺省為1
- OmniCpp_MayCompleteArray : 在"->"后是否自動運行omnicppcomplete給出提示信息。0/1, 缺省為1
- OmniCpp_MayCompleteScope : 在域標識符"::"后是否自動運行omnicppcomplete給出提示信息。0/1, 缺省為0
- OmniCpp_SelectFirstItem : 是否自動選擇第一個匹配項。僅當"completeopt"不為"longest"時有效。
- 0 : 不選擇第一項(缺省)
- 1 : 選擇第一項並插入到光標位置
- 2 : 選擇第一項但不插入光標位置
- OmniCpp_LocalSearchDecl : 使用Vim標准查找函數/本地(local)查找函數。Vim內部用來在函數中查找變量定義的函數需要函數括號位於文本的第一列,而本地查找函數並不需要。
『閱讀說明』
1)Vim存在多個配置文件vimrc,比如/etc/vimrc,此文件影響整個系統的Vim。還有~/.vimrc,此文件只影響本用戶的Vim。而且~/.vimrc文件中的配置會覆蓋/etc/vimrc中的配置。這里我們只修改~/.vimrc文件。
2)Vim的插件(plugin)安裝在Vim的runtimepath目錄下,你可以在Vim命令行下運行"set rtp“命令查看。這里我們選擇安裝在~/.vim目錄,沒有就創建一個。
3)當本文說”在Vim命令行下運行cmdxx命令“時,意思是指在Vim的命令行模式下運行cmdxx命令,即在Vim的正常模式下通過輸入冒號":"進入命令行模式,然后緊接着輸入命令cmdxx。在后文描述中都會省略冒號":"輸入。
4)如果沒有說明“在Vim命令行下運行某命令”,則是在shell中執行該命令。
5)如果命令中間被空白符間隔或有與正文容易混淆的字符,我會用雙引號將命令與正文區分。所以讀者在實際操作時,不要輸入命令最前面和最后面引號。
6)本文關於組合快捷鍵的描述,形如a-b形式的快捷鍵表示同時按下a鍵和b鍵,而形如"a-b c"形式的快捷鍵,則表示先同時按下a鍵和b鍵,然后放開ab鍵,再按下c鍵。
7) 本人使用的系統是Ubunt 11.10 ,Vim版本是Vi IMproved 7.3