MAC系统打造基于VIM的IDE

    折腾了两天的时间,总算是把vim环境给搭建好了,主要是一些插件的安装,大部分插件安装非常简单,唯独YouCompleteMe这个代码提示和补全插件,费了九牛二虎之力才搞好,这里写篇文章记录一下,以免以后又重复踩坑。

1 背景

    平常我们在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。

2 将VIM打造成IDE

    为了将vim打造成一款IDE,我们需要安装一些常用的插件,先来介绍一下这些插件。

2.1 CTags插件

    阅读代码的过程中最常见的就是能快速跳转到函数,变量的定义,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文件。

2.2 CScope插件

    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文件。

2.3 nerdtree插件

    这个插件以树形结构来显示项目的目录结构,其效果如下图:

    

    左侧多出了一个窗口展示项目的目录树。

    安装这个插件时可以先安装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 <F3> :NERDTreeToggle<CR>

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

    这都是网上抄过来的配置,一般情况下照抄就可以了。

2.4 YouCompleteMe插件

    这个就是本文的主角了。这是所有插件中最难安装的一个,如果你能一次性顺利安装,那么恭喜你,如果安装出问题,可以参考本文的步骤一步一步来,最后总会安装成功的。

    先来说说这个插件是做什么的。咱们平时在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 "<generator>" -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 <expr> <CR>       pumvisible() ? "\<C-y>" : "\<CR>"     
"上下左右键的行为 会显示其他信息  
"inoremap <expr> <Down>     pumvisible() ? "\<C-n>" : "\<Down>"  
"inoremap <expr> <Up>       pumvisible() ? "\<C-p>" : "\<Up>"  
"inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"  
"inoremap <expr> <PageUp>   pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"  

"youcompleteme  默认tab  s-tab 和自动补全冲突  
"let g:ycm_key_list_select_completion=['<c-n>']  
let g:ycm_key_list_select_completion = ['<Down>']  
"let g:ycm_key_list_previous_completion=['<c-p>']  
let g:ycm_key_list_previous_completion = ['<Up>']  
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 <F5> :YcmForceCompileAndDiagnostics<CR>    
"nnoremap <leader>lo :lopen<CR> "open locationlist  
"nnoremap <leader>lc :lclose<CR>    "close locationlist  
inoremap <leader><leader> <C-x><C-o>  
"在注释输入中也能补全  
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 <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处  
" #####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

    需要特别注意的事项,官网文档中用粗体都表出来了。只要按照文档中的一步一步来,就能少走弯路,一次性搞定。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值