折腾了两天的时间,总算是把vim环境给搭建好了,主要是一些插件的安装,大部分插件安装非常简单,唯独YouCompleteMe这个代码提示和补全插件,费了九牛二虎之力才搞好,这里写篇文章记录一下,以免以后又重复踩坑。
平常我们在Windows上看代码的时候,一般都用source insight,但是如果是在linux或者mac上,source insight就没得用了。你或许会说我用wine照样可以在linux上打开source insight呀?没错,问题是wine很不稳定,经常性卡死,而且还特别占内存,另外如果你在linux上用source insight,还很有可能被周围傲娇的同事给小小的鄙视一下,所以在linux上正确的姿势是拥抱vim。
但是对很多用惯了IDE开发的同学而言,vim这东西刚接触的时候会让你觉得难用到死以至于很快就放弃了,碰到这种情况,就俩字:坚持,找一个项目,然后实际操作,其实最常用的命令并不是特别多,在项目中多练几次就能记住了。除了常用命令,很多人可能更希望vim能像一个IDE那样,可以查找函数调用关系,可以搜索符号,可以跳转到符号定义处,可以有代码提示等等,这就需要用到额外的一些vim插件,有了这些插件的帮助,慢慢你就会发现vim真的可以让你爽到爆。本文接下来就来看看,如何将vim打造成一款IDE。
为了将vim打造成一款IDE,我们需要安装一些常用的插件,先来介绍一下这些插件。
阅读代码的过程中最常见的就是能快速跳转到函数,变量的定义,ctags插件就是用来帮我们做这件事的。关于ctags的安装网上有大把的文章,这里就不在重复。
用法也比较简单,安装好ctags以后,在项目的根目录下通过命令行输入ctags -R命令(如果是C++项目的话输入ctags -R --c++-kinds=+px --fields=+iaS --extra=+q),这样会在根目录下生成一个名为tags的项目的符号索引文件。之后就可以在vim中打开项目文件,然后通过命令来跳转了:
ctrl + ]:跳转到符号的定义出;
ctrl + t:回到跳转之前的位置;
注意,需要先cd到项目的根目录(tags文件所在的目录),然后在vim打开文件,否则vim会提示找不到tags文件。
cscope插件可以看做是ctags插件的增强版,通过cscope插件,可以查找函数的调用关系,在项目中查找字符串,查找符号定义,查找项目文件等等。
注意:cscope虽然支持c++,java,但是默认在解析的时候只解析.c和.h,如果你是c++或java的项目,想享受cscope的福利,需要把这些文件的名字和路径保存在一个名为cscope.files的文件中(通常通过find命令生成),cscope发现当前目录中存在cscope.files文件,就会为文件中列出的所有文件生成索引。
关于cscope的安装,网上也有一大堆的文章,比较简单,这里还是看看怎么用这个插件:
假设你是一个c++项目,在mac下可以:
(1) 生成cscope.files文件:
一般通过find命令来做:find . -name "*.cpp" -or -name "*.h" > cscope.files
这样项目中所有的.cpp,.h文件就保存到了cscope.files中。
(2) 生成索引,命令行输入命令cscope -bq生成索引,cscope还有许多选项,可以通过cscope -help来查看。
(3) 开始使用cscope。vim打开文件,通过find命令来查找符号定义或者函数调用关系:
:cs find s func:查找项目中所有引用符号func的地方;
:cs find g func:查找func的定义
:cs find d func:查找被func调用的函数
:cs find c func:查找调用func的函数
:cs find t astring:查找字符串
:cs find f init.cpp:查找项目中名为init.cpp文件。
这个插件以树形结构来显示项目的目录结构,其效果如下图:
左侧多出了一个窗口展示项目的目录树。
安装这个插件时可以先安装vbundle插件,vbundle是vim的插件管理器,它的安装方法和配置读者自行在网上搜索。安装完vbundle以后,在vimrc中增加nerdtree插件:
Plugin 'scrooloose/nerdtree'
Plugin 'Xuyuanp/nerdtree-git-plugin'
将这两个加到vimrc的call vundle#begin()和call vundle#end之间,然后打开vim,命令模式下输入:
:PluginInstall
很快,nerdtree插件就安装好了,安装好以后把下面这段nerdtree的配置写到vimrc里:
"使用F3键快速调出和隐藏它
map :NERDTreeToggle
let NERDTreeChDirMode=1
"显示书签"
let NERDTreeShowBookmarks=1
"设置忽略文件类型"
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']
"窗口大小"
let NERDTreeWinSize=25
" 修改默认箭头
let g:NERDTreeDirArrowExpandable = '▸'
let g:NERDTreeDirArrowCollapsible = '▾'
"How can I open a NERDTree automatically when vim starts up if no files were specified?
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
" 打开vim时自动打开NERDTree
autocmd vimenter * NERDTree
"How can I open NERDTree automatically when vim starts up on opening a directory?
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif
" 关闭vim时,如果打开的文件除了NERDTree没有其他文件时,它自动关闭,减少多次按:q!
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" 开发的过程中,我们希望git信息直接在NERDTree中显示出来, 和Eclipse一样,修改的文件和增加的文件都给出相应的标注, 这时需要安装的插件就是 nerdtree-git-plugin,配置信息如下
let g:NERDTreeIndicatorMapCustom = {
\ "Modified" : "✹",
\ "Staged" : "✚",
\ "Untracked" : "✭",
\ "Renamed" : "➜",
\ "Unmerged" : "═",
\ "Deleted" : "✖",
\ "Dirty" : "✗",
\ "Clean" : "✔︎",
\ "Unknown" : "?"
\ }
" 显示行号
let NERDTreeShowLineNumbers=1
let NERDTreeAutoCenter=1
" 在终端启动vim时,共享NERDTree
let g:nerdtree_tabs_open_on_console_startup=1
这都是网上抄过来的配置,一般情况下照抄就可以了。
这个就是本文的主角了。这是所有插件中最难安装的一个,如果你能一次性顺利安装,那么恭喜你,如果安装出问题,可以参考本文的步骤一步一步来,最后总会安装成功的。
先来说说这个插件是做什么的。咱们平时在IDE中写代码,少不了代码提示和自动补全,如果没有代码提示会是一件很郁闷的事,极大影响撸码的效率,YouCompleteMe插件就是做这个事情的,有图有真相:
这是官网上给出的示意图,是不是正是你想要的呢?接下来来看看这个插件怎么安装。
(1) 预置条件
首先,一定要确认几个问题:
a. vim一定要是最新版,mac系统自带的vim可能有问题,可以通过brew来安装一个最新的macvim。
b. vim必须要支持python脚本,打开vim,在命令模式下输入 echo has('python') || has('python3'),如果输出1,则可以继续往下了。
c. 系统要安装cmake,如果没有cmake,用brew安装。
d. 系统要安装python-dev,mac默认已经带了这个。
(2) 安装插件
确保满足(1)中的前置条件以后,接下来安装插件,还是通过vbundle来,在vimrc中加入以下插件:
Bundle 'Valloric/YouCompleteMe'
一定记得还是要放在call vundle#begin() 和 call vundle#end() 之间。
然后进入vim,输入:
:BundleInstall安装插件。
这一步一般不会有问题。安装完成以后,在~/.vim/bundle文件夹下可以看到一个YouCompleteMe的文件夹。
(3) 一般的插件在vbundle中下载安装就可以了,但是YouCompleteMe不同,这个插件下载下来以后还需要编译安装,cd到~/.vim/bundle/YouCompleteMe文件夹下面,然后:
./install.py --clang-completer
这样会开始编译安装YouCompleteMe。其中--clan-completer表示支持C系的代码提示和自动补全,YouCompleteMe还支持很多其他语言,java,go,js等等。如果想通吃,直接./install.py --all即可。
OK,如果你到目前为止没有遇到任何问题,那么恭喜你安装成功了。但是可能有很多人并不能得到幸运女神的眷顾,比如在这一步你可能遇到:
Import Error, No module named requests之类的问题。
这个很有可能是YouCompleteMe插件没有下载完全,此时可以在YouCompleteMe文件夹下面,然后命令行执行以下命令:
git submodule update --init --recursive
该命令可以检查并下载缺失的文件。执行完以后重新./install.py --clang-completer。
如果还是遇到错误,那么只能启动终极大招:自己编译安装了。
(4) 编译安装
首先下载llvm+clang二进制包,注意一定选最新的,否则编译会出错。下载地址:http://releases.llvm.org/download.html。选择最新版的CLang For macOS。
接下来在~目录下新建一个临时目录ycm_temp,将上面下载的二进制包解压到目录中。解压后的名字比较长,可以改成短一点的,假设改为clang-llvm。
cd到ycm_temp目录,然后命令行执行以下命令:
cmake -G "" -DPATH_TO_LLVM_ROOT=~/ycm_temp/clang-llvm . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
这一步一般没有问题,系统会给我们生成builid文件。接下来开始编译:
cmake --build . --target ycm_core --config Release
--config Release选项在mac上可以不要(加上也没关系)。
如果你使用的是最新版的llvm+clang,一般这一步不会有问题。如果出现编译错误,比如说这个符号找不到呀,那个头文件不存在呀之类的,很有可能是你的llvm+clang不是最新的。
如果编译成功,恭喜你离成功只差最后两步了。
(5) 配置YouCompleteMe
安装成功以后,还得配置一下,这个直接抄万能的网友做好的配置就可以了:
" #####YouCompleteMe Configure
let g:ycm_server_python_interpreter='/usr/bin/python'
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py'
" 自动补全配置
set completeopt=longest,menu "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
inoremap pumvisible() ? "\" : "\"
"上下左右键的行为 会显示其他信息
"inoremap pumvisible() ? "\" : "\"
"inoremap pumvisible() ? "\" : "\"
"inoremap pumvisible() ? "\\\" : "\"
"inoremap pumvisible() ? "\\\" : "\"
"youcompleteme 默认tab s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['']
let g:ycm_key_list_select_completion = ['']
"let g:ycm_key_list_previous_completion=['']
let g:ycm_key_list_previous_completion = ['']
let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
nnoremap :YcmForceCompileAndDiagnostics
"nnoremap lo :lopen "open locationlist
"nnoremap lc :lclose "close locationlist
inoremap
"在注释输入中也能补全
let g:ycm_complete_in_comments = 1
"在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:clang_user_options='|| exit 0'
"nnoremap jd :YcmCompleter GoToDefinitionElseDeclaration " 跳转到定义处
" #####YouCompleteMe Configure
(6) 配置ycm_extra_conf.py
这一步主要是做一些配置,告诉YouCompleteMe上哪里去搜索需要的头文件。首先在命令行输入命令:
echo | clang -v -E -x c++ -
你可以看到长长的一串输出:
红色部分圈出来的路径就是我们要在ycm_extra_conf.py文件中替换的路径。打开ycm_extra_conf.py(一般位于~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples目录),将其中-isystem对应的路径一一替换成红框中的路径,然后保存并退出。
至此,一切都已经完成,尽情享受vim和插件带来的快乐吧。
总结一下自己安装YCM插件失败的原因:
(1) YCM插件没有下载完全,比如已经编译安装完了,但是进入vim后没起作用,老是提示YouComplete unavailable,no moudle builtin之类的,这个就是插件没有下载完整,需要在YouCompleteMe目录下git submodule update --init --recursive将插件安装完整。
(2) 编译安装老是出错,提示XXX符号未定义,头文件不存在啥的,原因是下载的clang-llvm不是最新的,需要去官网下个最新版本。
参考文章:
https://blog.csdn.net/chenyyhh92/article/details/52464101/
另外,最好是按照官网上的文档一步一步来。mac系统中安装参考官网文档:
https://github.com/Valloric/YouCompleteMe#mac-os-x
编译安装参考官网文档:
https://github.com/Valloric/YouCompleteMe#full-installation-guide
需要特别注意的事项,官网文档中用粗体都表出来了。只要按照文档中的一步一步来,就能少走弯路,一次性搞定。