一步一步把vim打造成IDE
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 在新 书签 中打开选中文件,但不跳到新 书签
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,问题解决