前文
中,我主要讲了一堆软件的升级,其主要原因是为了支持YouCompleteMe这个安装起来超级复杂的插件,其余的插件安装很简单,有了vim-plug后,只需要2步,以NERDTree(目录树)为例
第1步,在
.vimrc
中添加插件项目地址,然后在vim中执行
:PlugInstall
命令(也可以直接克隆到
plug#begin
指定的目录,这点前文已经讲过):
1 2 3 4 5 6 7 8
call plug# begin ('~/.vim /plugged ') " NERDTree插件的github网址(不包含前缀https://github.com/) Plug 'scrooloose/nerdtree' " 其他插件 " ... call plug# end ()
第2步,添加插件相关的配置脚本,可以参考插件项目的README:
1 2 3 4 5
nmap <Leader> <Leader> :NERDTreeToggle<CR> let NERDTreeWinSize=32 let NERDTreeWinPos="right" let NERDTreeShowHidden=1 let NERDTreeMinimalUI=1
前文配置过
<Leader>
即分号(;)的代码,
nmap
这句就是配置快捷键,也就是连按2个;就等价于执行
:NERDTreeToggle
命令,打开树形目录,如下图所示:
后面的则是插件的配置,在注释中也给出了。使用方式可以参考项目的README,vim可以通过
Ctrl+W+上/下/左/右
在不同切分窗口中切换,当光标在树形目录中时可以用上下键移动:
Enter
如果光标所在行是目录,展开当前目录,否则直接打开该文件
纵向切分窗口中打开光标所在行对应文件,等价于
:split <filename>
横向切分窗口中打开光标所在行对应文件,等价于
:vsplit <filename>
更新树形目录
将根目录退回到上一层
将根目录变回光标所在行对应目录
1
Plug 'Valloric/YouCompleteMe'
YouCompleteMe
(简称YCM)可谓是vim环境下C/C++补全的标配了,不同于其他插件,YCM非常重量级,200多M,而且它对vim版本要求比较高,还要求vim支持python,最后还需要用clang来编译,因此前文做的大量工作都是为这个插件准备的。对于较新的Linux系统,手动编译完高版本的vim后,直接调用
./install.sh --clang-completer
就行,它会自动下载新版本的clang,但是对CentOS 6.10行不通,因此之前我手动编译了高版本的clang。
虽然我也找过替代品,但亲自尝试的结果是,现阶段补全C/C++确实没有比YCM体验更好的。
前文
的2.1节。安装依赖项后重新编译python即可。
进入YouCompleteMe目录,使用本地的gcc、g++、cmake、clang来安装:
1 2
CC ="$LOCAL /gcc-5.4.0/bin/gcc" CXX ="$LOCAL /gcc-5.4.0/bin/g++" ./install.py \ --clang-completer --system-libclang
最终会在
third_party/ycmd
目录下生成
ycm_core.so
。
为YCM配置ycm_extra_conf脚本
CentOS配置比较简单,C头文件都在
/usr/include
下,C++头文件则在自己安装的gcc目录下:
1 2 3 4 5 6
'-isystem' ,'/usr/include' ,'-isystem' ,os.environ ['HOME' ] + '/local/gcc-5.4.0/include/c++/5.4.0' , '-isystem' ,os.environ ['HOME' ] + '/local/gcc-5.4.0/include/c++/5.4.0/x86_64-unknown-linux-gnu'
需要注意的是
x86_64-unknown-linux-gnu
目录必须添加进去,否则会导致C++标准库无法补全,因为C++标准库头文件包含了该目录下的各种头文件,比如
thread
包含的3个头文件:
1 2 3
#include <bits/functexcept.h> #include <bits/functional_hash.h> #include <bits/gthr.h>
其中前2个都是出自
$GCC_DIR/include/c++/5.4.0/bits
目录,而第3个则是出自
$GCC_DIR/include/c++/5.4.0/x86_64-unknown-linux-gnu/bits
目录,因此必须把这个目录添加进去,否则头文件会解析失败。
cppcheck源码
手动编译。
pcre
,下载源码解压后,手动
./configure --prefix=<dirname>
、
make
、
make install
安装,然后在
~/.bashrc
中添加如下代码以指定gcc的包含路径和库路径:
1 2 3 4
export C_INCLUDE_PATH =$LOCAL /pcre/include:$C_INCLUDE_PATHexport CPLUS_INCLUDE_PATH =$LOCAL /pcre/include:$CPLUS_INCLUDE_PATHexport LD_LIBRARY_PATH =$LOCAL /pcre/lib:$LD_LIBRARY_PATHexport PATH =$LOCAL /pcre/bin:$PATH
然后进入cppcheck源码目录按照如下方式编译:
1 2
make SRCDIR =build CFGDIR =$LOCAL /bin/cfg HAVE_RULES =yes make install PREFIX =$LOCAL CFGDIR =$LOCAL /bin/cfg
然后将
$LOCAL/bin
添加到
.bashrc
的环境变量中:
1
export PATH =$LOCAL /bin:$PATH
之后ale便可使用cppcheck进行语法检查,比如C++11语法下的资源泄漏检查:
除此之外还有其他功能,可参考
cppcheck官网
的Undefined behaviour一栏。
1 2
Plug 'SirVer /ultisnips'Plug 'honza /vim-snippets'
1
Plug 'rhysd/vim-clang-format'
1
Plug 'vim-scripts/a.vim'
1
Plug 'skywind3000 /asyncrun.vim'
skywind
大佬(知乎账号为
韦易笑
,vim大神)写的插件,我的vim配置也大部分是参考他的
Vim 8下C/C++开发环境搭建
。这里也基本照搬配置了,使用说明可参考他的博客:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
let g:asyncrun_open = 6 let g:asyncrun_bell = 1 nnoremap <F10> :call asyncrun#quickfix_toggle(6 )<cr> nnoremap <silent> <F9> :AsyncRun g++ -std=c ++11 -Wall -O2 "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr> let g:asyncrun_rootmarks = ['.svn' , '.git' , '.root' , '_darcs' , 'build.xml' ] nnoremap <silent> <F7> :AsyncRun -cwd=<root> make <cr> "nnoremap <silent> <F5> :AsyncRun -raw -cwd=$(VIM_FILEDIR) " $(VIM_FILEDIR)/$(VIM_FILENOEXT)nnoremap <silent> <F5> :AsyncRun g++ -std=c ++11 -Wall "$(VIM_FILEPATH)" && ./a .out <cr>
由于vim 8才支持了异步执行终端命令,因此该插件需要vim版本至少为8。我的vim版本为8.1,还可以直接在vim中横向打开终端窗口(命令为
terminal
,默认横向打开,
vert term
纵向打开)。
1
Plug 'Yggdroot/LeaderF'
1
Plug 'mhinz/vim-signify'
1 2 3 4 5
Plug 'sickill/vim-monokai' " monokai主题 Plug 'vim-airline/vim-airline' " 美化状态栏 Plug 'vim-airline/vim-airline-themes' Plug 'plasticboy/vim-markdown' " markdown高亮 Plug 'octol/vim-cpp-enhanced-highlight' " C++代码高亮