把 Vim 打造成优秀的 C++ IDE

Posted tealex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把 Vim 打造成优秀的 C++ IDE相关的知识,希望对你有一定的参考价值。

对于 Windows 上做 C++ 开发的用户来说,vs 为他们做了大量的工作,语法高亮、自动缩进、智能提示等等,当你 happy 的使用 vs 时,请记住一点,这是一个收费软件,虽然在我大中华普遍都在使用微软的盗版软件,但作为程序员我们心里应该知道这是不对的行为,然后再去 —— 等等,我们今天讨论的不是这个话题,我们要说的是 Linux 下的免费软件 Vim!

Vim 插件安装的教程在互联网上已经数不胜数,但是质量也参差不齐,很多都是在其它地方转载 copy,而且没有注明使用环境,很多人安装时发现无法 work,最后搞得一团糟,今天这篇文章的宗旨只有两个:1、使得安装简单;2、保证可以用。

阅读这篇文章的前提是你至少使用过 Vim,知道基本的操作。下面就开始进入主题。

推荐:把 Vim 打造成一个简单实用的 IDE http://www.linuxidc.com/Linux/2011-06/37032.htm

准备工作

由于大多数 vim 插件都可以在 github 上找到,而且通过 git 安装、删除、升级插件都异常简单,因此我们需要首先安装 git 工具,如果不知道 git 和 github,可以先自行 Google

CentOS 安装

sudo yum install git

Ubuntu 安装

sudo apt-get install git

Mac 安装
由于 Mac 没有像 yum 和 apt-get 一样的包管理工具,需要先安装一个类似的包管理工具,这对于安装一些 Linux 命令是非常有帮助的

  1. 安装包管理工具 homebrew
     ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
    
  2. 通过 brew 安装 git
     brew install git
    

我将本文需要安装的插件和配置文件都放在了 github 上,如果你不想大费周折的了解每个插件的安装方式,可以直接下载所有插件即可使用,项目地址 https://github.com/handy1989/vim,可以按照如下命令备份并一次安装所有插件(注意,从 git 上下载的 vim 目录下都是隐藏文件,ls -a 可以查看)

mv ~/.vimrc ~/.vimrcbak
mv ~/.vim ~/.vimbak
git clone https://github.com/handy1989/vim.git
mv vim/.vimrc ~/.vim ~/

第一个插件 pathogen

为了不让插件安装后目录显得凌乱,我们很有必要安装一个管理插件的插件,这样功能的插件有好几个,这里只推荐一个 pathogen

项目地址
https://github.com/tpope/vim-pathogen

安装
可以通过 git 安装,也可以直接下载插件文件,由于这个插件只有一个文件,我们选择后者,而该插件的说明文档上也是用的这种方法。

mkdir -p ~/.vim/autoload ~/.vim/bundle && 
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

然后,就没有然后,这个插件就安装完了。是不是觉得 so easy! 不过先别急,我们还要对插件进行一些配置,用 vim 打开~/.vimrc,输入如下三行类容

execute pathogen#infect()
syntax on
filetype plugin indent on

保存退出,这个插件的安装配置就完成了,怎么验证插件有没有生效呢,别急,后面有的是机会验证。我们先来讲讲 vim 插件是个什么东西。

此时你的~/.vim 目录结构应该是这样的

├── autoload
│   └── pathogen.vim
└── bundle

可见~/.vim 目录下是有两个目录,其中 autoload 放的是 pathogen 插件,所谓的插件其实就是一个脚本,当 vim 启动时,它会自动加载~/.vim/autoload 目录下的脚本,由于你~/.vimrc 里配置了 execute pathogen#infect(),所以它会去自动的执行脚本里这个函数,至于这个函数是怎么实现的,我们不用管它,总之这个函数的功能就是去加载~/.vim/bundle 目录下你安装的所有插件,pathogen 的管理方法大致就是这样,而我们也看到,vim 的插件其实就是一个脚本文件,丰富一点的还会带有说明文档等其它内容,后面我们碰到了再讲解。

auto-pairs

项目地址
https://github.com/jiangmiao/auto-pairs(感兴趣的可以看)

功能
自动匹配括号、引号等

安装

git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs

这样就将 auto-pairs 在 github 上的项目文件下载到了~/.vim/bundle/auto-pairs 目录下

测试
随便打开一个文件,输入左括号 '(',看右括号是不是自动出现了,然后删除左括号,看右括号是不是也被删除了。当然功能远不止这些,但常用的就这几点。

NERDTree

项目地址
https://github.com/scrooloose/nerdtree

功能
显示目录树

安装

git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle

此时~/.vim/bundle/nerdtree 下应该有如下几个目录和文件

autoload
doc
lib
nerdtree_plugin
plugin
README.markdown
syntax

这几个目录是 vim 默认的插件目录,如果我们不是通过 pathogen 加载插件,就需要在~/.vim 目录下创建对应的这几个目录,并将 NERDTree 对应的文件拷到相应的目录,这样每个目录下会放置多个插件的内容,比如~/.vim/doc 下就会放置所有插件的帮组文档,而我们通过 pathogen 来管理,每个插件的所有内容都放在同一个目录中,比如这里的 NERDTree 插件的内容我们下载到了~/.vim/bundle/nerdtree 下,直接删除这个目录即可删除插件,如果后续插件有更新,在该目录下通过 git 命令也可以很容易更新到最新版本。

打开 vim,在命令行模式下输入:Helptags 载入插件的帮组文档,或者用:helptags help_dir 载入指定目录的帮组文档,其中 help_dir 是你需要加载的插件帮组文档所在的目录,比如这里是~/.vim/bundle/nerdtree/doc

测试
用 vim 打开一个文件,在命令行模式下输入:NERDTree,然后回车,窗口左侧就出现了 vim 工作目录的目录树,如下图所示

将光标置于 NERDTree 窗口,按 '?' 可查看帮助,NERDTree 的操作很简单,通常是将光标置于一个目录 / 文件上,通过一个按键来操作,下面列出几个常用按键及其对应的操作

文件相关操作
o  : 在光标所在的上一个窗口打开文件,并将光标置于新打开的窗口
go : 预览文件,光标停留在NERDTree窗口中
t  : 在新标签中打开文件并激活
gt : 在新标签打开文件,光标留在NERDTree窗口中
i  : 水平分割打开文件
gi : 水平分割预览
s  : 垂直分割打开文件
gs : 垂直分割预览

目录树相关操作
o  : 展开/关闭目录
O  : 递归展开目录。慎用,如果目录层级多,打开会很慢
x  : 关闭父目录
C  : 切换光标所在目录为根目录
u  : 切换目录树的根目录为上层目录
U  : 切换目录树的根目录为上层目录,并保持旧的目录树的状态
r  : 刷新当前目录
R  : 刷新当前根目录(这个在新加入文件后会用到)
cd : 切换vim工作目录为光标所在目录(命令模式下:pwd可查看当前工作目录)

为了方便打开 NERDTree,我们可以设置快捷键,打开~/.vimrc,插入如下一行

map <C-n> :NERDTree<CR>

这样,当打开 vim 时,只要输入 ctrl+n 即可打开 NERDTree

MiniBufExplorer

项目地址
http://www.vim.org/scripts/script.php?script_id=159

功能
显示已打开的 buffer

安装
以 6.3.2 版本为例,根据项目地址可以找到对应版本的下载链接

mkdir -p ~/.vim/bundle/minibufexplorer/plugin && wget "http://www.vim.org/scripts/download_script.php?src_id=3640" -O ~/.vim/bundle/minibufexplorer/plugin/minibufexpl.vim

测试
用 vim 打开一个文件,此时看不到 minibufexplorer 窗口,因为默认是只有一个 buffer 时不显示窗口的,在命令行模式下通过:vsp filename 打开另一个文件(或者用 NERDTree 浏览打开其它文件),看看此时窗口上方是不是出现了 MiniBufExplorer 的窗口,如下所示

我们先来解释一下什么叫 buffer,vim 为每个打开的文件都创建了一个 buffer,这个 buffer 存储在内存中,为了下次打开文件时快速加载,比如我们通过 NERDTree 浏览并打开了多个文件,即便某些文件你退出了编辑,它的 buffer 仍旧是存在的,在命令模式下,我们输入:ls 可以查看打开的 buffer 列表,每一行前面的数字对应 buffer 的编号,通过输入:b N,其中 N 代表 buffer 编号,可以打开对应的 buffer。对应上面的截图,我们打开了两个文件,此时 minibufexplorer 窗口显示有两个 buffer,即便我们关闭一个文件,这两个 buffer 仍然存在,将光标移到某个 buffer 的名称上,回车可打开对应的 buffer,按 d 可删除 buffer,具体的操作可以直接阅读插件文件,路径为~/.vim/bundle/minibufexplorer/plugin/minibufexpl.vim

配置
在~/.vimrc 文件中加入如下命令

let g:miniBufExplMaxSize = 2

该配置含义为 minibufexplorer 窗口最大高度为 2 行,默认是没有上限的,你打开的 buffer 足够多,一会一直增长下去,为了方便阅读我一般将它设为 2,其它配置不怎么用到,需要用的时候可以参考插件文件,并在~/.vimrc 中添加配置

ctags+taglist+omnicppcomplete

接下来就到了重磅戏了,前面还只是一些窗口相关的基本操作,是为了方便浏览文件,我们阅读 C++ 代码时希望能快速定位函数、变量,类似于 VS 等其它 IDE 提供的功能

ctags

这个并不是插件,而是可执行程序,是用来对代码建索引,方便查找的,有些 Linux 版本是自带 ctags 的,如果没有,按如下方式安装

sudo yum install ctags

ubuntu 安装方式

sudo apt-get install ctags

mac 也是自带 ctags 的,但是那个不好用,可以重新安装

brew install ctags

如果安装失败,看是不是因为 /usr/bin/ctags 文件已经存在,可以先 mv 走,然后再执行

创建索引:在你代码的根目录执行如下命令,会生成一个 tags 文件,此时在代码根目录下打开一个文件(vim 默认只加载工作目录下的 tags 文件),将光标置于一个函数或结构体名字上,按 ctr+] 即可跳转到该名称的定义处,如果出现多个选项,可以输入编号选择对应跳转的地方,按 ctr+o 可回到光标之前的位置

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

taglist

taglist 是 vim 的一个插件,可以将代码内的函数、变量等按规律列出来,方便查找

下载地址
http://www.vim.org/scripts/script.php?script_id=273,或者直接按如下方式下载并安装

cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=19574" -O taglist.zip && unzip taglist.zip -d taglist

这样就生成了~/.vim/bundle/taglist 目录,该目录的结构为

taglist
├── doc
│   └── taglist.txt
└── plugin
    └── taglist.vim

其中 plugin 目录下为插件文件,doc 目录下为说明文档。打开 vim,在命令行模式下输入:helptags ~/.vim/bundle/taglist/doc 可以加载说明文档,然后输入 help taglist.txt 则可以显示说明文档

配置
打开~/.vimrc,输入如下内容

let Tlist_Show_One_File=1    " 只展示一个文件的taglist
let Tlist_Exit_OnlyWindow=1  " 当taglist是最后以个窗口时自动退出
let Tlist_Use_Right_Window=1 " 在右边显示taglist窗口
let Tlist_Sort_Type="name"   " tag按名字排序

这几行配置看名字就能知道什么意思,引号后边是说明,在 vim 配置文件里,双引号代表注释,类似于 C 语言里的 /

如果打开过程中出现问题,例如

Taglist: Failed to generate tags for /Users/Zorba/Dropbox/RubymineProjects/rcafe/app/controllers/posts_controller.rb /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ctags: illegal option -- -^@usage:  
ctags [-BFadtuwvx] [-f tagsfile] file ...^@  

就要重新安装一遍 ctags

```

brew install ctags-exuberant

```

测试
打开一个文件,在命令行模式下输入:TlistToggle 即可显示 taglist 窗口,配合 NERDTree 一起效果如下

OmniCppComplete

这是一个对 C++ 进行语法补全的插件,可以对函数、命名空间、类成员等进行补全,使用起来和绝大多数 IDE 差不多,不一样的是 IDE 为你做了很多你不知道的事情,而 omni 补全需要依赖 tags 文件,需要你用 ctags 命令自己生成

下载地址
http://www.vim.org/scripts/script.php?script_id=1520

也可用如下命令直接下载并安装

cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=7722" -O omnicppcomplete.zip && unzip omnicppcomplete.zip -d omnicppcomplete

该命令会生成~/.vim/bundle/omnicppcomplete 目录,目录结构为

├── after
│   └── ftplugin
│       ├── cpp.vim
│       └── c.vim
├── autoload
│   └── omni
│       ├── common
│       │   ├── debug.vim
│       │   └── utils.vim
│       └── cpp
│           ├── complete.vim
│           ├── includes.vim
│           ├── items.vim
│           ├── maycomplete.vim
│           ├── namespaces.vim
│           ├── settings.vim
│           ├── tokenizer.vim
│           └── utils.vim
└── doc
    └── omnicppcomplete.txt

打开 vim,在命令行模式下输入:helptags ~/.vim/bundle/omnicppcomplete/doc 即可加载说明文档,输入:help omnicppcomplete 查看说明文档

配置
打开~/.vimrc 文件,输入

filetype plugin indent on
set completeopt=longest,menu
let OmniCpp_NamespaceSearch = 2     " search namespaces in the current buffer   and in included files
let OmniCpp_ShowPrototypeInAbbr = 1 " 显示函数参数列表
let OmniCpp_MayCompleteScope = 1    " 输入 :: 后自动补全
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]

测试
前面说过,omni 插件的补全是依赖于 tags 文件的,因此需要我们手动建立 tags 文件,假设现在有两个文件 hello.h 和 hello.cpp 如下

我们在和这两个文件所在的目录输入

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

这样就生成了 tags 文件,然后我们打开 main.cpp 来测试,当输入 hello.h 和 hello.cpp 中的函数或结构体时,通过按 ctr+x ctr+o 就可以自动补全了,效果如下

通过按 ctr+n 和 ctr+p 可以对候选项进行上下选择。通过这种方式可以实现对函数、结构体的补全

对 STL 补全
上面的方式只能对自己的代码进行补全,是当我们要使用其它库比如 STL 甚至是第三方库时就无法补全,原因很简单,我们只对自己的代码建立了 tags 文件,想要对其它库进行补全,就必须对它们的源代码建立 tags 文件,所幸的是 vim 的插件编写者们早已解决了这个需求,并且他们专门针对 STL 头文件进行了修改,以便能更好的适应 omni 的补全,首先下载 STL 源代码,地址为 http://www.vim.org/scripts/script.php?script_id=2358,可通过如下命令下载并解压

mkdir -p ~/.vim/tags && cd ~/.vim/tags && wget "http://www.vim.org/scripts/download_script.php?src_id=9178" -O - | tar jxvf -

这样就将 STL 的源码下载到了~/.vim/tags/cpp_src 目录下,我们在该目录下执行 ctags 命令

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

这样就生成了~/.vim/tags/cpp_src/tags 这个文件,然后打开~/.vimrc 进行如下设置

set tags+=~/.vim/tags/cpp_src/tags

该命令是设置 tags 文件的搜索路径,默认只有 vim 工作目录的 tags 文件,这样设置之后就会同时加载指定目录的 tags 文件,你可以在后面添加更多其它第三方库的 tags 文件,现在对 STL 的补全效果如下

omnicppcomplete 的补全设置虽然麻烦,但也让我们更加清楚了插件是怎样工作的,作为程序员,至少应该对某些东西的工作原理搞清楚,而不是像使用 IDE 一样不管任何东西,你想自定义一下东西也无从下手。

omnicppcomplete 触发补全需要用到 ctr+x ctr+o,显然这是不友好的,熟悉 Linux 命令行的人一定对 shell 命令的补全印象深刻,只需要按一下 TAB 键就可以进行补全,vim 插件的强大之处在于,它可以实现你几乎所有的需求,想要用 TAB 键进行补全,就需要用到 SuperTab

SuperTab

项目地址
https://github.com/ervandew/supertab

安装
使用 git 进行安装是最方便的

cd ~/.vim/bundle && git clone https://github.com/ervandew/supertab.git

测试
无需任何配置即可使用,这时你想要补全变量名或函数名只需按一下 TAB 键即可,出现候选窗口之后也可以用 TAB 键进行选择,这样是不是方便了很多!

由于 TAB 键被映射成了补全快捷键,也就无法通过 TAB 键直接输入制表符,这时如果想要输入制表符可以通过 ctr+v TAB 即可,即先输入 ctr+v 再输入 TAB 键,在 vim 下通过 ctl+v 可以输入很多不可见字符,比如试试 ctr+v ctr+w

最终的配置文件

装了这么多插件,在配置文件~/.vimrc 里也增添了不少内容,最后你的配置文件至少应该包含以下内容

set tags+=~/.vim/tags/cpp_src/tags   " 设置tags搜索路径
syntax on
filetype plugin indent on

map <C-n> :NERDTree<CR>

" pathongen
execute pathogen#infect()

" taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Use_Right_Window=1
let Tlist_Sort_Type="name"

" omnicppcomplete
set completeopt=longest,menu
let OmniCpp_NamespaceSearch = 2     " search namespaces in the current buffer and in included files
let OmniCpp_ShowPrototypeInAbbr = 1 " 显示函数参数列表
let OmniCpp_MayCompleteScope = 1    " 输入 :: 后自动补全
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]

这个配置文件全都是和插件相关的配置,你还可以在里面添加其它配置来灵活定制你的 vim,由于本文主要介绍插件相关内容,就不展开介绍了

总结

vim 的 C++ 开发环境到此就配好了,总的来说我们安装了这么几类插件

  1. 管理插件的插件
  2. 管理窗口和 buffer
  3. 语法增强
  4. 代码补全

通过这些插件我们可以将 vim 打造成一个好用的 IDE,虽然经过了很多周折,但这些功夫都不会白费,一来我们可以通过这些插件了解 IDE 的一些工作原理,二来通过这些插件的安装我们也更加了解了 vim 插件的使用方法,有了这些基础,后续如果想满足一些个性化的需求,岂不易哉!

更多 Vim 相关教程见以下内容

Vim 学习指南 http://www.linuxidc.com/Linux/2013-08/89096.htm

快速学会 Vi 编辑器 http://www.linuxidc.com/Linux/2013-08/88586.htm

强大的 Vim 编辑器 http://www.linuxidc.com/Linux/2013-07/87544.htm

在 CentOS 6.2 上搭建 Vim 开发环境 http://www.linuxidc.com/Linux/2013-07/87363.htm

CentOS 5.4 安装高亮 Vim 编辑工具 http://www.linuxidc.com/Linux/2013-06/86508.htm

Vim 技巧分享:C 语言设置 http://www.linuxidc.com/Linux/2012-12/77124.htm

Ubuntu 中设置 Vim 的行号 http://www.linuxidc.com/Linux/2012-12/75485.htm

 

以上是关于把 Vim 打造成优秀的 C++ IDE的主要内容,如果未能解决你的问题,请参考以下文章

10款优秀Vim插件帮你打造完美IDE

10款优秀Vim插件帮你打造完美IDE

10款优秀Vim插件帮你打造完美IDE

Vim打造成 炫酷 多功能的IDE

将Vim打造成简单IDE

如何将 Vim 打造成一个成熟的 IDE