正所謂“工欲善其事,必先利其器”,要想當一個合格的碼農,必須先把自己的開發環境搞好。Linux下的Vim已經用了兩年多了,由最開始的憤怒加拍鍵盤到現在的愛不釋手,Vim的強大只有去用時間去丈量。這里就把自己的Vim配置總結一下,同時也參考了網絡上面其他同仁的文章。自己做個記錄,也希望能幫到大家。
環境:Fedora 2(老掉牙了,沒辦法,我們做的東西就跑在這個上面), Vim7.3。
基本配置
在home目錄下建立.vimrc文件,這是Vim的主配置文件。在這個文件中加入如下配置。
1 "Basic settings 2 set tabstop=2 3 set shiftwidth=2 4 set backspace=2 5 set autoindent 6 set nocompatible 7 syntax on 8 set hlsearch 9 set number 10 set ruler 11 set showcmd 12 set showmatch 13 set wrap 14 set hidden " Keep the unsaved changes in the buffer when you switch to another file 15 set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 " file encoding 16 filetype plugin indent on
具體的不解釋了,大家可以搜索一下網絡,或者查看一下vim的help文檔,不過這些都是最基本的,估計不能再少了。Vim的文檔時英文的,如果大家看的不爽的話,可以安裝中文文檔:
下載地址:http://vimcdoc.sourceforge.net/
下載最新版之后解壓縮,之后用命令sudo ./vimcdoc.sh –i安裝,貌似用root安裝可以所有用戶都可以用到。打開gvim輸入:help就可以看到文檔了。如果還是英文的,就在.vimrc中添加set helplang=cn。
插件配置
Vim的精髓就是插件。給Vim提供了非常豐富的額外功能。
1. 源碼閱讀 ctags+taglist+cscope
注:vim有可能不支持cscope,可以用命令vim –version | grep cscope查看。如果不支持,需要重新編譯安裝vim。Configure的時候加上-enable-cscope選項。
下載taglist最新版本,並安裝:http://www.vim.org/scripts/script.php?script_id=273
接下來用通過如下命令生成tags:
ctags -R --c-kinds=+p --c++-kinds=+px --python-kinds=-i --extra=+q --fields=+ilaS $SRCDIRPATH
其中這其中的選項包含了對其他插件的支持,具體參數的意義可以參考man tags。
接下來生成cscope.out文件。可以事先通過腳本生成cscope所需的源文件列表。通過cscope生成cscope.out文件。如下:
生成文件列表:
1 if [ ! -f "$CSFILELIST" ]; then 2 find $SRCDIRPATH -regex ".*/.*\.\(c\|h\|cc\|cpp\|cxx\|C\|hh\|hpp\|H\|hxx\)" > $CSFILELIST 3 fi
構建cscope:
1 cscope -bkqc -i $CSFILELIST
最后就是.vimrc里面的配置了,加載ctag和cscope.out文件,以及設置快捷鍵:
1 " TagList and winmanager plugin settings 2 let Tlist_Auto_Open=1 3 let Tlist_Exit_OnlyWindow=1 4 let Tlist_File_Fold_Auto_Close=1 5 let Tlist_Show_One_File=0 6 set tags=/TAGS/PATH/tags 7 8 " cscope setting 9 cs add /CSCOPE/OUT/PATH/cscope.out 10 nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR> 11 nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR> 12 nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR> 13 nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR> 14 nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR> 15 nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR> 16 nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> 17 nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>
使用方法:
s: 查找C語言符號,即查找函數名、宏、枚舉值等出現的地方
g: 查找函數、宏、枚舉等定義的位置,類似ctags所提供的功能
d: 查找本函數調用的函數
c: 查找調用本函數的函數
t: 查找指定的字符串
e: 查找egrep模式,相當於egrep功能,但查找速度快多了
f: 查找並打開文件,類似vim的find功能
i: 查找包含本文件的文件
? gd 轉到當前光標所指的局部變量的定義
? * 轉到當前光標所指的單詞下一次出現的地方
? # 轉到當前光標所指的單詞上一次出現的地方
? ctrl+] 轉到函數定義的地方
? ctrl+t 回退到函數調用的地方
2. 編寫代碼——代碼補全 neocomplcache+code_complete+omnicppcomplete
neocomplcache: 可以彈出提示框補全變量、類型,而且可以對當前文件進行緩存,補全精准。用於書寫過程的關鍵詞補全。
下載地址:http://www.vim.org/scripts/script.php?script_id=2620
code_complete: 可以用於代碼塊和常用語句模板補全,可以替代snipMate,最主要的是它可以用於函數參數補全。
下載地址:http://www.vim.org/scripts/script.php?script_id=1764
omnicppcomplete: 由於neocomplcache對結構體、類成員補全的支持不好,所以需要這個插件進行補充,在輸入.或者->之后它會自動彈出提示框,進行補全。
下載地址:http://www.vim.org/scripts/script.php?script_id=1520
在.vimrc中進行如下配置:
1 " Neocomplcache settings 2 let g:neocomplcache_enable_at_startup = 1 3 let g:neocomplcache_enable_smart_case = 1 4 let g:neocomplcache_enable_camel_case_completion = 1 5 let g:neocomplcache_min_syntax_length = 3 6 "let g:neocomplcache_enable_underbar_completion = 1 7 " <C-h>, <BS>: close popup and delete backword char. 8 inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>" 9 inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>" 10 inoremap <expr><C-y> neocomplcache#close_popup() 11 inoremap <expr><C-e> neocomplcache#cancel_popup() 12 13 " Omnicppcomplete settings ( Close the preview window automatically ) 14 autocmd CursorMovedI * if pumvisible() == 0|pclose|endif 15 autocmd InsertLeave * if pumvisible() == 0|pclose|endif
說明:neo的功能十分強大,支持緩存、駝峰匹配等功能。具體需要參考文檔。在這里設置了從第三個字符開始自動匹配。還有退格鍵匹配太慢,所以禁用了退格鍵的自動匹配。omni的preview windows很煩人,上面的設置的意思是在匹配完成之后preview window會自動關閉。如果壓根兒就不想讓preview window出來,需要在.vimrc加上set completeopt=menu。
用法:在自動出現提示框之后,可以按CTRL+N和CTRL+P上下切換。在輸入完成函數以及(的時候,可以按TAB鍵,就會自動補全函數參數,填寫完畢之后繼續按TAB鍵,知道完成。也可以輸入if之后按TAB鍵補全if語句。
3. 輔助功能: echofunc、括號自動匹配等
echofunc在gvim下很好用,鼠標移到一個函數或者變量上面會有提示框出來列出他們的基本信息,同事在輸入完成函數之后還可以在下邊的狀態欄上對參數進行提示。
下載地址:http://www.vim.org/scripts/script.php?script_id=1735
在.vimrc中進行如下配置:
1 " 括號匹配 2 ":inoremap ( ()<ESC>i 3 ":inoremap ) <c-r>=ClosePair(')')<CR> 4 :inoremap { {}<ESC>i 5 :inoremap } <c-r>=ClosePair('}')<CR> 6 :inoremap [ []<ESC>i 7 :inoremap ] <c-r>=ClosePair(']')<CR> 8 :inoremap < <><ESC>i 9 ":inoremap > <c-r>=ClosePair('>')<CR> 10 11 " Echofunc (echofunc.vim) 12 let g:EchoFuncKeyNext='<S-n>' 13 let g:EchoFuncKeyPrev='<S-p>' 14 let g:EchoFuncAutoStartBalloonDeclaration = 1 15 16 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 17 """"""""""""""""""" Functions """"""""""""""""""""""""" 18 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 19 function ClosePair(char) 20 if getline('.')[col('.') - 1] == a:char 21 return "\<Right>" 22 else 23 return a:char 24 endif 25 endf
用法:在輸入完成函數的左括號,或者在輸入函數參數的過程中,可以通過通過按SHIFT+N或者SHIFT+P來提示函數參數。提示信息會在下邊狀態欄顯示。
4. 各種快捷鍵設置
在.vim中進行如下設置:
1 " Hotkeys 2 map <silent> <F2> :TlistToggle<CR> 3 map <silent> <F3> :set list<CR> 4 map <silent> <F4> :set nolist<CR> 5 map <silent> <F5> :w!<CR> 6 map <silent> <F6> :cs reset<CR> 7 map <F12> :w<CR>:call CompileRun()<CR> 8 map <F12><F12> :w<CR>:call Debug()<CR> 9 10 map <S-t> :tabnew<CR> :tabnext<CR> 11 map <silent> <A-1> :tabn 1<CR> 12 map <silent> <A-2> :tabn 2<CR> 13 map <silent> <A-3> :tabn 3<CR> 14 map <silent> <A-4> :tabn 4<CR> 15 map <silent> <A-5> :tabn 5<CR> 16 map <silent> <A-6> :tabn 6<CR> 17 map <silent> <A-7> :tabn 7<CR> 18 19 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 20 """"""""""""""""""" Functions """"""""""""""""""""""""" 21 """"""""""""""""""""""""""""""""""""""""""""""""""""""" 22 func CompileRun() 23 if &filetype == 'c' 24 exec "!gcc % -g -o %<" 25 exec "!.\/%<" 26 elseif &filetype =='cpp' 27 exec "!g++ % -g -o %<" 28 exec "!.\/%<" 29 elseif &filetype == 'python' 30 exec "!python %" 31 endif 32 endfunc 33 34 func Debug() 35 if &filetype == 'c' 36 exec "!rm %<" 37 exec "!gcc % -g -o %<" 38 exec "!ddd %<" 39 elseif &filetype == 'cpp' 40 exec "!rm %<" 41 exec "!g++ % -g -o %<" 42 exec "!gdb %<" 43 exec "!rm %<.class" 44 elseif &filetype == 'java' 45 exec "!javac %" 46 exec "!jdb %<" 47 elseif &filetype == 'python' 48 exec "!pdb %" 49 endif 50 endfunc
用法:
F2:打開和關閉taglist
F3:顯示文件結束符以及TAB符號
F4:隱藏文件結束符以及TAB符號
F5:強制保存
F6:重置cscope連接。因為我們在編寫代碼的同時,cscope會過時,所以可以用定時任務自動重建cscope,重建完成之后vim中的cscope連接會失效,可以按F6重置。
F12:自動編譯運行當前文件。適合做實驗。連續按兩次F12會啟動DDD調試當前文件。
最后:個別插件是需要cscope或者ctags設置指定參數之后生成支持文件之后才能使用的,如果想單獨使用某個插件的花,最好仔細閱讀以下vim.org上的說明。
參考文獻:
http://www.vimer.cn
http://www.cnblogs.com/gnuhpc/archive/2012/01/13/2321400.html