將vim 改造成功能強大的IDE系列之三
『外掛程式介紹』
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 ~/.vimrc/doc
5)使用ctags產生標籤庫
對於C++代碼,需要在~/.ctags 中加入下面幾個選項(去除中文):
--c++-kinds=+p : 為標籤添加函數原型(prototype)資訊 --fields=+iaS : 為標籤添加繼承資訊(inheritance),存取控制(access)資訊,函數特徵(function Signature,如參數表或原型等) --extra=+q : 為類成員標籤添加類標識
至此,安裝結束!
『準系統使用方法』
在配置好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)成員)。
- OmniCpp_ShowScopeInAbbr : 選項用來控制匹配項所在域的顯示位置。預設情況下,omni顯示的補全提示菜單中總是將匹配項所在域資訊顯示在縮減資訊最後一列。
- 0 : 資訊縮減中不顯示匹配項所在域(預設)
- 1 : 顯示匹配項所在域,並移除縮減資訊中最後一列
- OmniCpp_ShowPrototypeInAbbr : 是否是補全提示縮減資訊中顯示函數原型。
- 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