我是这样用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>

  

 

posted @ 2018-04-12 20:55  穆游  阅读(5621)  评论(0编辑  收藏  举报