OmniComplete是基于ctags的,所以要先安装ctags

http://www.vim.org/scripts/script.php?script_id=2358下载cpp_src.tar.bz2,解压,进入目录,运行下面这条命令

ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f cpp

然后就会在这个目录下生成一个文件名为cpp的文件,这就是我们需要的

然后到http://www.vim.org/scripts/script.php?script_id=1520下载omnicppcomplete-0.41.zip

解压到/etc/vim目录下(解压出3个文件夹after, autoload, doc)

然后用编辑器打开/etc/vimrc,把下面内容粘进去(用文件名为cpp的文件的真实目录替换【目录】)

" ctags 索引文件 (根据已经生成的索引文件添加即可, 这里我额外添加了 hge 和 curl 的索引文件) 
set tags+=【目录】/cpp 
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

需要 " filetype plugin on ", 不然 OmniComplete 无法自动识别 C/C++ 文件类型进行补全。

要改变自动补全窗口的配色可以在 vimrc 中加上:

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

2. 使用ctags生成标签库

对于C++代码,ctags需要额外使用以下选项:

  • --c++-kinds=+p : 为标签添加函数原型(prototype)信息
  • --fields=+iaS : 为标签添加继承信息(inheritance),访问控制(access)信息,函数特征(function Signature,如参数表或原型等)
  • --extra=+q : 为类成员标签添加类标识

3. omnicppcomplete补全提示菜单

使用后,omnicppcomplete会弹出如下补全提示菜单

  1. +-------------------------------------+
  2. |method1(   f  +  MyNamespace::MyClass|
  3. |_member1   m  +  MyNamespace::MyClass|
  4. |_member2   m  #  MyNamespace::MyClass|
  5. |_member3   m  -  MyNamespace::MyClass|
  6. +-------------------------------------+
  7. ^       ^  ^          ^
  8. (1)     (2)(3)        (4)

其中1为符号名称;2为符号类型;3为访问控制标识;4为符号定义所在域(scope)。

3.1 符号名称

1为omnicppcomplete所查找到的可选符号(symbol)名称,如以'('结尾,则为函数。

3.2 符号类型

符号的类型,可能的值为

  • 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)

3.3 访问控制

类成员访问控制,取值:

  • + : 公共(public)
  • # : 保护(protected)
  • - : 私有(private)

3.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内部用来在函数中查找变量定义的函数需要函数括号位于文本的第一列,而本地查找函数并不需要。

vim - 自动补齐的更多相关文章

  1. CentOS 7下的Vim自动补齐插件YouCompleteMe安装及配置

    备注:现在对于 YouCompleteMe 的安装应采用更为简单的方法,即利用 Vundle 来安装这个插件.具体方法可见: Vundle 主页 YouCompleteMe 主页 而 .vimrc 的 ...

  2. CocoaPods 导入第三方库头文件自动补齐

    使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ...

  3. 为Debian/Ubuntu的apt-get install添加自动补齐/完成功能

    Debian/Ubuntu的apt-get太常用了,不过偶尔可能也会碰到不太熟悉,想不起来的包的名称,除了去debian packages去查找,另外的方法就是给Debian/Ubuntu添加自动补齐 ...

  4. Vim自动补全神器–YouCompleteMe

    YouCompleteMe的特别之处 基于语义补全 总所周知,Vim是一款文本编辑器.也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是什么.在Vim被程序员所使用后,其慢慢的被肩负了与IDE ...

  5. jquery.autocomplete自动补齐和自定义格式

    1.简单的下拉自动补齐,可以使用本地或远程数据源 <input name="autoTag" id="autoTag" /> var source ...

  6. VIM自动补全插件 - YouCompleteMe--"大神级vim补全插件"

    VIM自动补全插件 - YouCompleteMe 序言 vim 之所以被称为编辑器之神多半归功于其丰富的可DIY的灵活插件功能,( 例如vim下的这款神级般的代码补全插件YouCompleteMe) ...

  7. HTML5的数据自动补齐功能

    使用datalist元素,HTML5允许使用一组数据来生成自动补齐功能,现在你不需要使用第三方js代码或者类库啦! <input name="frameworks" list ...

  8. 数据结构《16》----自动补齐实现《一》----Trie 树

    1. 简述 Trie 树是一种高效的字符串查找的数据结构.可用于搜索引擎中词频统计,自动补齐等. 在一个Trie 树中插入.查找某个单词的时间复杂度是 O(len), len是单词的长度. 如果采用平 ...

  9. Android Studio-设置switch/case代码块自动补齐

    相信很多和我一样的小伙伴刚从Eclipse转到Android Studio的时候,一定被快捷键给搞得头晕了,像Eclipse中代码补齐的快捷键是Alt+/ ,但是在AS中却要自己设置,这还不是问题的关 ...

随机推荐

  1. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  2. C#常用的数据格式转换

    用DataFormatString格式化GridView 在 GridView里面显示数据,要显示的数据有好多位小数,就想让它只显示两位小数,在delphi里,直接用DisplayFormat就行了, ...

  3. enode框架step by step之框架的物理部署思路

    enode框架step by step之框架的物理部署思路   enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by s ...

  4. 单例模式及C++实现代码

    单例模式及C++实现代码 单例模式 单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目.但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能 ...

  5. asp.net MVC 路由机制 Route

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  6. HDU 2076 夹角有多大(题目已修改,注意读题)

    Problem Description 时间过的好快,一个学期就这么的过去了,xhd在傻傻的看着表,出于对数据的渴望,突然他想知道这个表的时针和分针的夹角是多少.现在xhd知道的只有时间,请你帮他算出 ...

  7. STL迭代器与部分算法学习笔记

    迭代器是类似指针的对象,分为5种,输入,输出,前向,双向和随机访问 输入迭代器(InputIterator) 输入迭代器并不是指某种类型,而是指一系列类型 举例 template<class I ...

  8. 基于Ajax的长轮询(long-polling)方式

    如 图 1 所示,AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面 ...

  9. 模拟Vue之数据驱动5

    一.前言 在"模拟Vue之数据驱动4"中,我们实现了push.pop等数组变异方法. 但是,在随笔末尾我们提到,当pop.sort这些方法触发后,该怎么办呢?因为其实,它们并没有往 ...

  10. UE4创建空白关卡并添加碰撞体

    让我们接着上次继续学习UE4引擎,今天我们学习下怎样创建空白的关卡以及添加碰撞物体. 一. 创建空白关卡 1) 点击文件 -> 新建关卡(或者按快捷键Ctrl+N). 2) 你可以选择Defau ...