我是这样用vim写代码的--插件篇
上一篇介绍了vim的简单编辑方式。熟练掌握vim的基本操作后,还只是一个得心应手的文本编辑器,终究是比IDE要弱很多的。强大的vs中,代码目录树,代码跳转,函数浏览,自动补全,代码调试等功能才是我们舍弃文本编辑器拥抱IDE的核心原因。本篇将介绍本人长期依赖的插件,及基本使用方法,从而真正能够完全用vim环境做开发。
首先要说明的是,自己手动管理插件是非常麻烦的一件事,在尝试了一段痛苦的手动管理经历后,本人果断清掉了本地的插件文件夹,开始使用Vundle,一个很方便的vim插件管理器。Vundle本身也是一个vim插件,只需要在vimrc里面配置好即可方便的安装、更新、删除插件,非常好用。
Vundle的安装请参考 https://github.com/VundleVim/Vundle.vim
安装好之后,就可以随心所欲添加github上的各种插件了。这里推荐本人觉得非常必要且好用的几个插件,并附上一些特殊配置项。
Nerdtree Plugin 'scrooloose/nerdtree'
文件目录树插件,打开目录页签可以方便的浏览工程目录,切换文件,创建、删除和移动文件。
本人的特殊配置:
let g:NERDTreeChDirMode=2 该设置使得当前工作目录与nerdtree的根目录一致,这样可以快速的切换工作目录,配合后续插件设置,使得查找等操作更得心应手。
Nerdtree的使用很简单,命令行输入:NERDTree或者:NERDTreeToggle可打开关闭Nerdtree窗口,不过一般建议在vimrc中配置快捷键,本人使用Ctrl+n(首字母,好记)。在Nerdtree窗口中的移动,和在一般编辑窗口中一致。按下?键,则可以开关快速的帮助。
这里列一下最常用的快捷键:
u/shift+u 根目录移到上层目录,后者会保留当前根目录为展开状态。
shift+c 将当前目录设为根节点。
shift+r 刷新当前根目录,由于刷新根目录也比较快,所以本人总是刷新根目录。
enter 展开或折叠目录,如果是文件则可以直接打开文件,比较符合直觉。
o/i/s 三个快捷键均是用于打开当前文件的。只是o是在上一个窗口显示,i是纵向分窗口显示,s是横向分窗口显示。在想要参考文件内容时,后两个快捷键很有用。
有以上快捷键,基本上就能简单使用Nerdtree了。
Ctrlp Plugin 'ctrlpvim/ctrlp.vim'
该插件实现了类似sublime的快速文件查找和跳转。在工程较大时,用来跳转文件非常方便。
let g:ctrlp_working_path_mode = 'wa' 在工作目录下的任一文件中使用ctrlp,都会搜索整个工作目录下的文件,大型工程中可随时查找工程目录下其他文件。
let g:ctrlp_custom_ignore={
\ 'dir': '\v[\/]\.(git|hg|svn)$',
\ 'file': '\v\.(exe|so|dll|xls|xlsx|doc|docx|meta|bytes|ppt|pptx)$',
\ }
ctrlp忽略目录和文件,该项设置可根据自己项目需要设置。
ctrlp的快捷键非常好记,就是ctrl+p,按下后会跳出相应搜索窗口,输入要搜索的文件名,回车即可打开文件。同样ctrl+s,ctrl+v可以分割窗口打开。当有搜索到多个文件时,可使用ctrl+j/ctrl+k上下移动,选择文件。
Taglist Plugin 'vim-scripts/taglist.vim'
标签列表插件,可以快速查看当前文件的标签、函数、变量等。
let Tlist_Show_One_File=1 每次只显示一个文件的标签,工程较大时,如果显示所有文件的标签打开会很慢。
let Tlist_Use_Right_Window=1 默认打开到窗口右侧,由于nerdtree已经占用了左侧窗口,taglist放到右侧,避免冲突。
let Tlist_GainFocus_On_ToggleOpen=1 打开时光标放到taglist窗口,这样打开后可以直接挪动光标到对应的标签跳转,也可以直接按q退出taglist窗口。
let Tlist_Close_On_Select=1 选中标签后就关闭taglist窗口,个人喜好taglist只在要跳转时出现。
由于vim文件内搜索非常方便,因此使用相对较少。回车即可打开,选择相应的标签,回车跳转。
CtrlSF Plugin 'dyng/ctrlsf.vim'
看名字猜用途,就是全局搜索插件,配合一定的设置和快捷键,能到达到和vs中一样的搜索体验。该插件的安装稍微麻烦一点,需要依赖ack或ag。针对windows有编译好的版本可以直接使用 https://github.com/k-takata/the_silver_searcher-win32。将执行文件放到vim目录下即可。
let g:ctrlsf_ackprg='ag' 据说ag效率更高一点
let g:ctrlsf_default_view_mode='compact' 默认设置下,ctrlsf的形态很像sublime的搜索,每个结果有前后部分上下文,个人更偏好vs式的预览,这两种模式也可以按M随时切换。
let g:ctrlsf_auto_close=0 设置不自动关闭,搜索字符串不像搜标签,经常需要点开看看。
let g:ctrlsf_case_sensitive='no' 大小写不敏感,为了查询更快速,默认设成大小写不敏感搜索。
let g:ctrlsf_ignore_dir=['tags'] 忽略部分目录
let g:ctrlsf_default_root='cwd' 设置在当前工作目录下搜索,和nerdtree一致。
以上配置,加上快捷键配置后,任意位置按下ctrl+f,即可全局搜索当前词,也可删掉当前内容,输入要查找的内容(由于这种需求较少,所以没有单独设快捷键)。如搜索内容中间有空格之类的特殊字符,可在最外侧用单引号包起来。
YouCompleteme Plugin 'Valloric/YouCompleteMe'
最难装却是最重要的插件,自动补全插件,没有这个插件的情况下,vim自带的neocomplete也能简单用用,但确实没有YCM强大。
let g:ycm_min_num_of_chars_for_completion=2 设置最少2个字符触发补全
let g:ycm_semantic_triggers={
\ 'c' : ['->', '.'],
\ 'lua' : ['.', ':'],
\} 触发语义分析的符号,基本上可以媲美vs,并且对lua等脚本语言也能有很好的补全效果。
该功能本人认为不需要快捷键,打几个字母就会自动跳出提示。
以上就是本人日常工作中用到的所有插件了。最开始的时候,总觉得什么插件都好,装了一大堆插件,由于有些插件会有按键冲突之类的,一边用一边删,最后就留下了以上几个插件。一些项目特殊需要,可以自己写一些简单的vimscript函数,配上快捷键。使用了两年下来,基本没有觉得有什么短缺的,完全能胜任编码工作。文章最后贴上本人windows系统上的vimrc,可以参考酌情使用。
source $VIMRUNTIME/vimrc_example.vim source $VIMRUNTIME/mswin.vim behave mswin set diffexpr=MyDiff() function MyDiff() let opt = '-a --binary ' if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif let arg1 = v:fname_in if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif let arg2 = v:fname_new if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif let arg3 = v:fname_out if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif if $VIMRUNTIME =~ ' ' if &sh =~ '\<cmd' if empty(&shellxquote) let l:shxq_sav = '' set shellxquote& endif let cmd = '"' . $VIMRUNTIME . '\diff"' else let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"' endif else let cmd = $VIMRUNTIME . '\diff' endif silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 if exists('l:shxq_sav') let &shellxquote=l:shxq_sav endif endfunction "vundle----------------------------------------------------------------------- set nocompatible " be iMproved, required filetype off " required " set the runtime path to include Vundle and initialize set rtp+=$HOME/vimfiles/bundle/Vundle.vim/ call vundle#begin('$HOME/vimfiles/bundle/') " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' Plugin 'scrooloose/nerdtree' let g:NERDTreeChDirMode=2 Plugin 'vim-scripts/taglist.vim' let Tlist_Show_One_File=1 let Tlist_Use_Right_Window=1 let Tlist_GainFocus_On_ToggleOpen=1 let Tlist_Close_On_Select=1 Plugin 'ctrlpvim/ctrlp.vim' let g:ctrlp_working_path_mode = 'wa' let g:ctrlp_custom_ignore={ \ 'dir': '\v[\/]\.(git|hg|svn)$', \ 'file': '\v\.(exe|so|dll|xls|xlsx|doc|docx|meta|bytes|ppt|pptx)$', \ } Plugin 'vim-scripts/a.vim' Plugin 'dyng/ctrlsf.vim' let g:ctrlsf_ackprg='ag' let g:ctrlsf_auto_close=0 let g:ctrlsf_case_sensitive='no' let g:ctrlsf_default_view_mode='compact' let g:ctrlsf_ignore_dir=['tags'] let g:ctrlsf_default_root='cwd' Plugin 'Valloric/YouCompleteMe' let g:ycm_min_num_of_chars_for_completion=2 let g:ycm_semantic_triggers={ \ 'c' : ['->', '.'], \ 'lua' : ['.', ':'], \} " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required "endvundle----------------------------------------------------------------------- set backspace=2 " more powerful backspacing set encoding=utf-8 set fileencodings=ucs-bom,utf-8,chinese set langmenu=zh_CN.UTF-8 let $LANG='zh_CN.UTF-8' source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim colorscheme desert syntax enable syntax on set lines=50 columns=200 linespace=1 set background=dark set guifont=consolas:h11:cANSI set foldenable set foldmethod=manual set tabstop=4 set shiftwidth=4 set softtabstop=4 set autoindent set noundofile set nobackup set noswapfile set ignorecase set hlsearch set incsearch set showmatch set wildmenu set ruler set laststatus=2 set number set exrc set secure set cursorline set tags=tags; "set guioptions-=m "menu bar set guioptions-=T "toolbar set guioptions-=r "scrollbar set guioptions-=L map <silent> <C-j> :resize+5<CR> map <silent> <C-k> :resize-5<CR> map <silent> <C-h> :vertical resize-5<CR> map <silent> <C-l> :vertical resize+5<CR> map <silent> <C-Up> :resize-5<CR> map <silent> <C-Down> :resize+5<CR> map <silent> <C-Left> :vertical resize-5<CR> map <silent> <C-Right> :vertical resize+5<CR> map <silent> <C-tab> :tabn<CR> map <silent> <C-n> :NERDTreeToggle<CR> map <silent> <C-m> :TlistToggle<CR> nmap <C-f> <Plug>CtrlSFCwordPath vmap <C-f> <Plug>CtrlSFVwordPath "open folder of current file function Folder() silent exec "!explorer " . expand("%:h") endfunction nmap <silent> <S-e> :call Folder()<CR>