一步一步把vim打造成IDE

未来已来2018-09-10 13:09
作者:鲁子银

vim高度的可扩展性,使其能通过插件和配置文件的相互组合,实现IDE的诸多功能:如代码补全,函数定义跳转,文件目录树,源码的结构化浏览等。
本文将从零开始一步一步把vim打造成一个精简版IDE,旨在提高linux下的开发效率以及日常运维效率,同时也想和其他的vim老司机们交流vim使用经验。

若你按本文一步一步配置,将达到的最终效果如下(以python开发为例)
代码编辑视图:
我把该视图的30秒演示视频放到了b站方便展示:    https://www.bilibili.com/video/av17176370/

调试视图:

把一个官方标配的vim打造成如上效果,预计花费时间:2~3小时。
本文尽可能让读者能理解每一行配置的含义,以便在出错或者需要个性化定制时自行修改。
依赖:操作系统:debian8.(macOS,其他linux发行版均适用),vim版本 >= 7.3.584

step 0:安装准备
    1.确定当前系统中的vim是否支持python语言特性(这是自动补全的基础)
      vim --version
         
      如图,若python或python3前的符号为"+",则表示当前vim支持python语言特性,可直接跳到下一步.
      若为"-",则需重新编译安装vim以支持python。不用担心,vim的编译安装过程很友好:(以py2为例,py3同理)
      首先卸载系统自带vim:
       apt-get remove vim
      接着安装编译vim时所需依赖:
       apt-get install gcc make python-dev libncurses5-dev libncursesw5-dev

      从vim官网下载vim8.0源码并解压:

       wget ftp://ftp.vim.org/pub/vim/unix/vim-8.0.tar.bz2
       tar -xvf vim-8.0.tar.bz2  &&  cd vim80/
     配置,编译,安装
        ./configure  --enable-pythoninterp=yes --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu  ( /usr/lib/python2.7/config-x86_64-linux-gnu 换成自己的python lib的路径)
        make && make install
                安装成功后此时vim8.0的可执行文件路径为:/usr/local/bin/vim   配置文件路径为:/usr/local/share/vim
                为了在shell中直接使用vim命令,可以把 /usr/local/bin/vim做一个软链到/usr/bin/vim,或者直接使用 update-alternatives 手工注册vim80为vim默认打开程序:
        update-alternatives --install /usr/bin/vim vim /usr/local/bin/vim 1000
                此时使用vim --version能看到vim已对python提供支持
               
    
    2.安装vim插件管理管理工具vundle
       vundle是一个基于git仓库的vim插件管理工具,类似python的pip。
       vim启动时,配置文件读取顺序可简单理解为:先读.vimrc,再载入所有vim配置文件路径的plugin文件夹下所有.vim文件。没有vundle之前,vim插件的安装都是手工增删plugin文件夹中的.vim文件,十分不方便,有了vundle之后,实现一键安装和卸载,还提供如插件搜索等高级功能。了解vundle详细功能和原理参考: https://github.com/VundleVim/Vundle.vim
       首先下载vundle到当前用户家目录
                   git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 
       在~/.vimrc中添加如下配置(注:vimrc文件的注释为双引号")
                   set nocompatible                  " 去除对vi的兼容
                   filetype off                       " 关闭文件类型检测

                   set rtp+=~/.vim/bundle/Vundle.vim   " 设置vundle路径
call vundle#begin() " 插件管理函数开始 Plugin 'VundleVim/Vundle.vim' " 在此添加需要安装的插件列表,格式 Plugin 'git用户/git仓库' 或者 Plugin '协议://git url' " 例如: " Plugin 'https://github.com/davidhalter/jedi-vim.git' " Plugin 'rstacruz/sparkup' call vundle#end() " 插件管理函数结束 filetype plugin indent on " 必须,作用未知

       至此准备工作全部完毕,后续统一使用vundle来安装所需插件

step 1:显示文件目录树和多书签文件编辑 
    这一步将使用 NERDTree插件,来实现在vim显示文件目录树的功能,如图
    1.在~/.vimrc中的插件管理函数之间添加一行:
              call vundle#begin()
              ...
              Plugin 'https://github.com/scrooloose/nerdtree.git'
              ...
              call vundle#end()      

    2.打开vim,键入vim命令 :BundleInstall

         此时vundle会列出当前已安装和未安装的插件列表,并从上到下依次自动安装:
              
         当对应插件前的符号变成+时,代表插件安装完毕
    3.在~/.vimrc中添加如下针对nerdtree的配置:
            "NERDTree config
             map <F4> :NERDTreeToggle<CR>  " F4一键开关目录树
             autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") &&b:NERDTreeType == "primary") | q | endif  " 当目录树窗口为最后一个窗口时自动退出vim
    4.使用nerdtree
        重新打开vim让配置文件生效,敲F4,则会弹出文件目录树窗口,该窗口显示当前路径下的文件和文件夹,目录树中通过上下键移动,敲回车展开折叠文件夹以及打开对应文件,敲ctrl+w+w让光标自动在目录树窗口和文件编辑窗口自动切换
        nerdtree的快捷键非常多,以下为我最常用的
            o       在已有窗口中打开文件,并跳到该窗口
            go        在已有窗口中打开文件,但不跳到该窗口
            t       在新 书签 中打开选中文件,并跳到新 书签
            T       在新 书签 中打开选中文件,但不跳到新 书签
            gT        切换到下一个书签
            gt        切换到上一个书签
           :tabc       关闭当前的书签
        更多快捷键可参考 http://yang3wei.github.io/blog/2013/01/29/nerdtree-kuai-jie-jian-ji-lu/

step 2:自动补全和"跳转至定义"功能
    传统的vim自动补全使用的是ctags,以及vim自带快捷键ctrl+p基于上下文自动补全.ctags通过扫描工作路径生成.tags文件,在vim运行时引入对应的.tags文件便可实现补  全.
    后来出现一个大名鼎鼎的补全工具 YouCompleteMe(下文简称YCM),堪称媲美vs的自动补全效果,足见其强大。默认支持语言:c,c++,obj-c,c#,python。 对于其他的语言,会调用vim设置的 omnifunc 来匹配,因此同样支持 php , ruby 等语言。但YCM的安装十分困难和折腾,他并不是一个简单的.vim文件, 而是需要编译成可执行文件后再安装,并且整合了多种vim插件。我花了一天时间终于找到了一个靠谱的安装路线(redhat,debian主流版本测试均通过):
      1.安装依赖
                sudo apt-get install build-essential cmake  python-dev  python3-dev
      2.在~/.vimrc中的插件管理函数之间添加一行: 
                Plugin 'https://github.com/Valloric/YouCompleteMe.git'

      3.同上一步,打开vim,键入 :BundleInstall

           这个时候可能等的时间会相当的长,因为YCM足足有240MB大。
          此时安装完毕后,vim状态栏可能会显示:
          The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). YCM core library not detected; you need to compile YCM before using   it.              Follow the instructions in the documentation. 
          提示你需要手工编译, 这个报错直接忽视
      4.进入YouCompleteMe的下载路径,执行YCM自带安装脚本
                cd  ~/.vim/bundle/YouCompleteMe
                chmod a+x install.sh  &&  ./install.sh  (此处若要YCM支持C,C++补全,添加安装参数  ./install.sh --clang-completer 此时会clang自动安装
          如图,只要提示进度到达100%中途未自动退出,则YCM至此安装完成


    使用vim打开python文件,验证YCM是否生效:
  
          可见最初始的补全背景色为紫红色,显得非常突兀,并且补全后会自动弹一个窗口,里面是当前补全类型的说明,非常蛋疼,于是我们在vimrc中加入如下配置来优化 YCM:
                         "ycm
                         set completeopt=longest,menu  " 取消补全后的弹窗
                         highlight Pmenu ctermfg=15 ctermbg=0 guifg=#000000 guibg=#111100 " 把补全背景色换成当前vim的背景色

          此时效果如下

        
        光标定位到任意函数,变量或类,键入vim命令:YcmCompleter GoTo,可跳转至其定义处(python的系统函数/类暂不支持),我们把跳转至定义功能绑定到<F6>快捷键,打开~/.vimrc,添加一行配置
                         map <F6> :YcmCompleter GoTo<CR>

       此时按下F6后可直接跳转到定义. 跳转至定义后如何跳转回去? ctrl+o


step 3:源码的结构化浏览功能(可选)
    使用taglist插件 可将源码中定义的类、函数、变量等以树结构显示,一目了然,方便快速定位。
    
    taglist的安装和配置网上相关实现方案,这里不再赘述。可参考 Vim中配置Taglist插件

step 4:调试(可选)
   使用vim调试代码本质上是利用了vim的窗口多开特性,然后把调试器的信息分类输出到各个窗口,来达到类似IDE的效果。
   感兴趣的同学可以尝试用vim script来手工实现调试环境,这里使用vim的 DBGPavim 插件来实现在vim中调试python。关于该插件的原理可参考 https://github.com/brookhong/DBGPavim.git ,安装步骤如下:
   1.安装DBGPavim,同上,在~/.vimrc中的插件管理函数之间添加一行:
                Plugin 'https://github.com/brookhong/DBGPavim.git'

    打开vim,键入 :BundleInstall等待安装完成,安装完毕后在~/.vimrc中增加如下配置:

                let g:dbgPavimPort = 9009

   这里的Port就是DBGPavim要监视的端口,要与调试器的端口一致,默认是9000。 

   2. 下载vim专用python调试器pydbgp
   可以从 这里下载pydbgp对应不同平台的可执行文件,下载完毕后解压到当前路径:
               tar -zxvf Komodo-PythonRemoteDebugging-11.0.1-90797-linux-x86_64.tar.gz  && cd  Komodo-PythonRemoteDebugging-11.0.1-90797-linux-x86_64
   结果如下:
   
   接着把文件夹中的pydbgp移动到pythonlib文件夹下,否则后面会报错dbgpClient缺失
               cp pydbgp pythonlib/

   最后把pydbgp加入环境变量,方便vim调用。(若觉得该调试功能好用,可把该环境变量永久生效)

              export PATH=$PATH:~/Komodo-PythonRemoteDebugging-11.0.1-90797-linux-x86_64/pythonlib
   3. 在vim中使用pydbgp调试python代码
   用vim打开python文件,敲F5让vim进入调试模式,此时若看到右下角显示bap-LISN-9009,则说明DBGPavim安装成功,表示正在监听9009端口,等待pydbgp传递调试信息。
此时在需要设置断点的行敲F10,该行头部变为绿色,表示下断点成功:
       
   调试工作准备完毕,此时键入vim命令 :Dp,此时后台会启动pydbgp调试当前python文件,并向9009端口传递调试信息,再按F5,会自动跳转到调试界面,类似文章开头的调试视图。
   进入调试视图后,则可以像IDE一样,使用步进,步出,监视当前环境变量,跳转到下一个断点等功能,操作方法如下:
         F5	启动调试监听
         F6	停止调试监听

         F1	打开或关闭帮助窗口
         F2	单步进入
         F3	单步跳过
         F4	单步退出
         F5	继续执行直到下一个断点,如果后续没有断点就退出调试模式。
         F9	最大化某个子窗口,或者重置窗口布局。
         F11	查看当前执行环境下的所有变量的值,在不同的堆栈层次,会有不同的结果。
         F12	查看光标下的变量的值。
   调试模式下的快捷键,和vim normal模式下的快捷键不冲突,十分省心。

至此一个精简版的IDE已打造完毕,可能有的同学会发现与一个完整的IDE相比还有一些缺失的重要功能:代码折叠
代码折叠其实是一个vim的内建功能,可根据所用编程语言自定义折叠规则,使用起来也是十分方便,可参考vim中文文档中 代码折叠章节


附录:
  1.针对上述配置的一个完整.vimrc文件  vimrc示例.txt
  2.关于YCM补全C,C++代码的补充说明:
      安装YCM时若开启了C,C++支持,安装完毕后打开.c或.cpp文件发现并不生效,原因c标准库中的头文件未加入到YCM的补全搜索范围,解决方法:
      ~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py 文件中进行配置,在 flag 列表中如下:

      '-isystem',
      '/usr/include',
      '-isystem',
      '/usr/include/c++/4.9.2',
      '-isystem',
      '/usr/include',
      '/usr/include/x86_64-linux-gnu/c++',

      最后在~/.vimrc中添加一行

              let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

     重新打开vim,问题解决

本文来自网易实践者社区,经作者鲁子银授权发布