上一篇介紹了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>