Vim 中使用 OmniComplete 为 C/C++ 自动补全(部分增加)

最后都变了- 提交于 2019-12-07 08:41:15

对原文做了部分修改及增加,原文地址http://timothyqiu.com/archives/using-omnicomplete-for-c-cplusplus-in-vim/


OmniComplete 并不是插件的名字,而是 Vim 众多补全方式中的一种(全能补全)。说白了 OmniComplete 其实就是根据光标前的内容猜测光标后的内容,具体怎么猜取决于所采用的脚本。

而 OmniCppComplete 就是专为 C/C++ 编写的 OmniComplete 一个补全脚本。

那么经常和 OmniCppComplete 一起出没的 Ctags 又是什么呢?Ctags 全名 Exuberant Ctags,是一个独立的程序(也就是说,其实和 Vim 一点关系都没有)。它可以为各种语言的源代码生成语言元素(language object)索引文件。对于 C/C++ 来说,就是把源代码中的各种宏、函数、类、类成员等等元素和它们的相关信息生成索引文件,供其它程序使用。

OmniCppComplete 脚本就是根据 Ctags 生成的索引文件进行补全的。 好了,背景知识就是这样,安装步骤如下:

安装 Ctags

一般ctags 都是默认安装过的,fedora下可以用yum list ctags,查看是否安装

  1. 从官网下载 Ctags 可执行文件,网站是 http://ctags.sourceforge.net/
  2. 将下载到的文件(仅 EXE 文件即可)解压到一个目录,例如 D:/ctags
  3. 将该目录加入环境变量 PATH


准备索引文件

以生成 C++ 标准库索引文件为例:

  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 文件夹,执行:

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!