omnicppcomplete,Vim中C/C++代码补全插件,基于ctags所生成的标签库。官方网址:omnicppcomplete,当前最新版本:v0.41。
onmicppcompete功能:
- 命名空间(namespace),类(class),结构(struct)和联合(union)补全
- 函数属性成员和返回值类型补全
- "this"指针成员补全
- C/C++类型转换(cast)对象补全
- 类型定义(typedef)和匿名类型(anonymous types)补全
1. 下载安装
①官版下载:omnicppcomplete-0.41。
②将压缩包(包含有after/autoload/doc三个文件夹)解压至~/.vim路径下
③检查/修改Vim配置,确定关闭了Vi兼容模式,并打开了文件类型自动检测选项
filetype plugin on
④启动Vim后使用以下命令为Vim添加omnicppcomplete帮助信息
2. 使用ctags生成标签库
对于C++代码,ctags需要额外使用以下选项:
- --c++-kinds=+p : 为标签添加函数原型(prototype)信息
- --fields=+iaS : 为标签添加继承信息(inheritance),访问控制(access)信息,函数特征(function Signature,如参数表或原型等)
- --extra=+q : 为类成员标签添加类标识
6. 其他
更详尽帮助,可以在在官网获取,或在vim中使用以下命令获取:
以上ctags选项,也可写入ctags配置文件(~/.ctags)中。
3. 在Vim中使用omnicppcomplete
在配置好Vim,并生成了ctags标签库前提条件下,Vim中在需要代码补全的地方使用快捷键<Ctrl-x><Ctrl-o>,omnicppcomplete会给出相应的提示信息,'↑'或'↓'可移动光标。
4. omnicppcomplete补全提示菜单
使用<Ctrl-x><Ctrl-o>后,omnicppcomplete会弹出如下补全提示菜单
- +-------------------------------------+
- |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)。
4.1 符号名称
1为omnicppcomplete所查找到的可选符号(symbol)名称,如以'('结尾,则为函数。
4.2 符号类型
符号的类型,可能的值为
- c : 类(class)
- d : 宏(macro definition)
- e : 枚举值(enumeator)
- f : 函数(function)
- g : 枚举类型名称<enumeration name)<="" li="">
- m : 类/结构/联合成员(member)
- n : 命名空间(namespace)
- p : 函数原型(function prototype)
- s : 结构体名称(structure name)
- t : 类型定义(typedef)
- u : 联合名(union name)
- v : 变量定义(variable defination)
4.3 访问控制
类成员访问控制,取值:
- + : 公共(public)
- # : 保护(protected)
- - : 私有(private)
4.4 符号定义所在域
符号在何处被定义。
5. omnicppcomplete选项设置
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内部用来在函数中查找变量定义的函数需要函数括号位于文本的第一列,而本地查找函数并不需要。