本文轉自:http://blog.csdn.net/dinosoft/article/details/6330121
有些牛X的人性格會比較古怪,VIM就是這么一位特立獨行,難以琢磨的怪客。但如果熟悉了,你就會發現他的好。
VIM(VI,VIM,GVIM)這東西不好上手,而且是相當不好上手,基本上新手打開這個編輯器,想試着輸入幾個字符之后,便會很惱火地把VIM關掉。
第一次接觸vim是上網找工具自動縮進代碼。在網上拷的代碼因為html的原因,沒處理好縮進會全亂掉,手動調那會蛋疼死的。這種機械的話顯然要交給機器做。上網搜了一下,居然只找到vim的方法,所以自己就下了一個,gg=G,按了幾個奇怪的按鍵,代碼就自動縮進好了。
我之前用過一下,也去看了一些資料,最后覺得這東西是歷史的產物,是當年還沒鼠標,圖形界面不發達的產物。完完全全違反人機交互啊有木有!!所以便把VIM給拋棄了。不過最近又陸陸續續看到關於VIM的一些調侃,而且在一些IT公司的筆試題里面居然有考關於VIM的!所以我決心要好好研究一下VIM,邁入"使用VIM的裝B高級程序員" 行列。畢竟這東西名氣這么大,應該名不虛傳吧。不花精力研究一下,恐怕就要錯失一個好東東了。
自己使用后的體驗:
- 手不用離開鍵盤,比較方便。不過因為我自己的Thinkpad筆記本帶有小紅帽,我后來基本就用那個,不用鼠標,確實手要離開鍵盤比較不方便。可能vim的一些特性優勢就沒有那么明顯了。
- 按鍵的兼容問題。大部分人肯定都像我一樣,win中毒很深,用ctrl+c,ctrl+v復制粘貼。但linux里面ctrl+c是interrupt signal。vim里面還有好幾個寄存器,搞得想從系統粘貼還要按好多個鍵,我是受不了。當然,由於vim強大的自定義功能,按鍵可以自定義,改到自己合用。而win版的gvim已經更改好按鍵了。
個人認為最好的入門方法:
- 先明白vi有兩種模式:命令模式和插入模式,按 i 進入插入模式,可進行一般的編輯;按 ESC 回到命令模式。其實還有一種是可視模式啦,按v。
- Vim命令速查卡!!(鏈接萬一掛掉就自己搜吧)http://coolshell.cn/articles/150.html,這個版本直接打印會有問題,因為不是標准的A4,所以只打印出中間的一塊,可以用我改好的版本http://ishare.iask.sina.com.cn/f/15406711.html
自己玩一下,先熟悉基本的編輯功能。
vim的擴展基本就是插件和快捷鍵映射,用gvim的話可以在菜單找到啟動設定,會自動打開啟動配置文件,在linux下是~/.vimrc
Vim進階設置
1.配色
使用vim肯定要選一個自己喜歡的代碼高亮配色。- 在線查看並下載(推薦這個) http://code.google.com/p/vimcolorschemetest/
- 打包下載,在 http://www.vim.org/scripts/script.php?script_id=625,由於配色很多,要一個一個試也很麻煩。可以使用插件ColorSchemeExplorer查看(選定后回車生效http://www.vim.org/scripts/script.php?script_id=1298)使用命令 :ColorSchemeExplorer 我自己本機上運行出現錯誤, 打開csExplorer.vim,用雙引號注釋掉第36行即可" exe "silent bot ".10."new "."Color Explorer"
2.快速從模板建立文件
原帖地址:http://www.gracecode.com/archives/2414/
最近很多人被我“拉下水”嘗試 (g)Vim,為了支持他們,我會編寫些 Vim 腳本方便大家。
這里有個現成的需求,就是很多從 Editplus 轉過來的同學,想讓 Vim 有從模板新建文件的功能。那么,這篇文章可能就是你們想要的。
安裝步驟
下載代碼包以后,解壓縮到$VIMRUNTIME 目錄。重新啟動 Vim,輸入
/*在系統終端看不到這個變量,可以進入vim后輸入 :echo $VIMRUNTIME。我的系統上是/usr/share/vim/vim72,注意只是把plugin解壓到$VIMRUNTIME 目錄,(后記:其實~/.vim/plugin目錄才是正道!)template要放到下面提到的對應目錄,作者應該是在windows下的,那個插件腳本是win格式的換行,在我的ubuntu上啟動的時候報錯,我用Geany改成Unix格式的換行就行了。*/
//注意:在我的ubuntu下,更新gvim后,目錄的版本號也變了,變成/usr/share/vim/vim73了
:NewTemplate xhtml
就可以建立個 XHTML 模板,如果是 Vim 7.0 以上的版本,還有個命令
:NewTemplateTab xhtml
即可在新的標簽頁中新建文件。當然可以映射快捷鍵,快速新建常用的文件類型,比如我的
" 新建 XHTML 的快捷鍵 map nn :NewTemplateTab xhtml<cr>
在 normal 模式下,連續按兩次 n 就可以在新標簽頁建立 xhtml 文件了。
配置腳本
此插件文件的路徑在
$VIMRUNTIME/plugin/Template.vim
下,主要有兩個配置選項,默認為
let g:TemplatePath=$VIM.'/vimfiles/template/' let g:TemplateCursorFlag='#cursor#'
其中,g:TemplatePath 為模板路徑,而 g:TemplatePathCursorFlag 則為新建模板以后鼠標移動到的位置(如無指定,則移動到文件底部)。
增加模板
//我自己加了c++的模版,注意名字為cpp.tpl,不是c++.tpl。會根據名字語法高亮,所以不能隨便起。
腳本支持用戶新建模板,找到 g:TemplatePath 中的 xhtml.tpl 目錄。參考其中的內容
<html> <body> #cursor# </body> </html>
應該很容易理解。比如需要新建 python 模板。則在 g:TemplatePath 中建立 python.tpl 並加入#cursor# 的位置即可。
3.我寫acm程序的配置
先說明具體想要達到的功能:
- 快速從模版新建c++文件。開頭那些include什么的就不用寫了。(上面介紹的模版已實現)
- 按一下按鍵把粘貼板的內容(測試數據保存到指定文件)。
- 按一下按鍵編譯,按一下按鍵自動運行(輸入重定向到那個測試數據文件)。
- gdb調試(這東西涉及進程通訊,所以要通過對源碼打補丁,再重新編譯,不能直接通過插件安裝,我猜想應該是這樣)
- map <F9> :call SaveInputData()<CR>
- func! SaveInputData()
- exec "tabnew"
- exec 'normal "+gP'
- exec "w! /tmp/input_data"
- endfunc
按F9之后,會新打開一個tab,然后在正常模式執行“+gP,也就是粘貼,接着w!強制寫入到/tmp/input_data文件,放到/tmp,無垃圾,綠色環保!
第三點:
網上一般介紹用按鍵映射gcc編譯命令,但這樣會有問題,就是無法使用quickfix窗口(參看附錄那篇文章的介紹),也就是出錯后我們可以打開quickfix窗口顯示出錯信息,而不是切換回編輯模式那些出錯信息就沒了,而且支持直接跳轉到出錯代碼行。
我們把按鍵映射到命令:make即可。而make是根據set makeprg=g++\ %\ -o\ /tmp/a 自動設置編譯參數的。生成到/tmp/a,一樣環保!
最后我們這些下面的設置就能一鍵運行了:
- map <F6> :call ExecCpp()<CR>
- func! ExecCpp()
- exec "!/tmp/a < /tmp/input_data"
- endfunc
第四點:
直接去vimgdb的官網看吧,沒比這更好的教程了 http://clewn.sourceforge.net/install.html#vimgdb ,同頁面還有一個叫Clewn的東西,調試的時候得開兩個窗口,很囧。
注意:用g++編譯的時候得帶-g參數;vimgdb用ctrl+B加breadpoint,R = run,C= continue,P = 打印變量值,簡單就這幾個命令,詳細的看gdb的手冊和~/.vim/macros/gdb_mappings.vim
附錄有我的設置,按F7開/關gdb調試。當然編譯時會加調試信息的。
- -g
- 加入調試代碼,可以在完成后使用 strip命令刪除用於調試的信息
well蛋!
附錄:
推薦一篇好文章
手把手教你把Vim改裝成一個IDE編程環境(圖文)
原文地址:http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx
我自己的 ~/.gvimrc文件(或~/.vimrc)
- sset encoding=utf8
- let g:vimgdb_debug_file = ""
- run macros/gdb_mappings.vim
- set langmenu=zh_CN.UTF-8
- set imcmdline
- source $VIMRUNTIME/delmenu.vim
- source $VIMRUNTIME/menu.vim
- set backspace=indent,eol,start
- set whichwrap=b,s,<,>,[,]
- syntax on
- set nocompatible
- set number
- set cin
- set autoindent
- set smartindent
- set tabstop=4
- set shiftwidth=4
- set showmatch
- set et
- set autochdir
- let Tlist_Show_One_File=1
- let Tlist_Exit_OnlyWindow=1
- let g:winManagerWindowLayout='FileExplorer|TagList'
- nmap wm :WMToggle<cr>
- filetype plugin indent on
- set completeopt=longest,menu
- let g:SuperTabRetainCompletionType=2
- let g:SuperTabDefaultCompletionType="<C-X><C-O>"
- map <F5> :w<CR>:make<CR>
- imap <F5> :w<CR>:make<CR>
- "map <F12> :call CompileCpp()<CR>
- "func! CompileCpp()
- "exec "w"
- "exec "!g++ -g % -o /tmp/a"
- "endfunc
- map <F6> :call ExecCpp()<CR>
- func! ExecCpp()
- exec "!/tmp/a < /tmp/input_data"
- endfunc
- map <F9> :call SaveInputData()<CR>
- func! SaveInputData()
- exec "tabnew"
- exec 'normal "+gP'
- exec "w! /tmp/input_data"
- endfunc
- map <F8> :call RunPython()<CR>
- func! RunPython()
- exec "w"
- exec "!python %"
- endfunc
- "source $VIMRUNTIME/mswin.vim
- "behave mswin
- map <A-c> NewTemplateTab cpp<cr>
- map <A-p> NewTemplateTab python<cr>
- "map nn :NewTemplateTab cpp<cr>
- "map np :NewTemplateTab python<cr>
- autocmd FileType python setlocal et sta sw=4 sts=4
- let g:pydiction_location = '/home/dinosoft/.vim/pydiction/complete-dict'
- set makeprg=g++\ -g\ %\ -o\ /tmp/a
- autocmd FileType cpp nmap <C-N> :cn<cr>
- autocmd FileType cpp nmap <C-P> :cp<cr>
- color tango-desert
- :inoremap ( ()<ESC>i
- :inoremap ) <c-r>=ClosePair(')')<CR>
- :inoremap { {<CR>}<ESC>O
- :inoremap } <c-r>=ClosePair('}')<CR>
- :inoremap [ []<ESC>i
- :inoremap ] <c-r>=ClosePair(']')<CR>
- ":inoremap " ""<ESC>i
- ":inoremap ' ''<ESC>i
- function ClosePair(char)
- if getline('.')[col('.') - 1] == a:char
- return "\<Right>"
- else
- return a:char
- endif
- endfunction
- nmap <S-Insert> "+gP
- imap <S-Insert> <ESC><S-Insert>i
- vmap <C-C> "+y
- vmap <S-Insert> "+gP
- nmap <C-left> gt
- imap <C-left> gt
- nmap <C-right> gT
- imap <C-right> gT
- nmap <C-S> :w!
- imap <C-S> :w!
- map <C-A> ggVG
~/.vim/macros/gdb_mappings.vim
- " Mappings example for use with gdb
- " Maintainer: <xdegaye at users dot sourceforge dot net>
- " Last Change: Mar 6 2006
- if ! has("gdb")
- finish
- endif
- let s:gdb_k = 1
- map <F7> :call <SID>Toggle()<CR>
- " Toggle between vim default and custom mappings
- function! s:Toggle()
- if s:gdb_k
- let s:gdb_k = 0
- " easwy add
- if ! exists("g:vimgdb_debug_file")
- let g:vimgdb_debug_file = ""
- elseif g:vimgdb_debug_file == ""
- call inputsave()
- let g:vimgdb_debug_file = expand("%:r:t")
- call inputrestore()
- endif
- call gdb("file /tmp/a")
- "call gdb("file " . g:vimgdb_debug_file)
- " easwy end
- map <Space> :call gdb("")<CR>
- nmap <silent> <C-Z> :call gdb("\032")<CR>
- nmap <silent> B :call gdb("info breakpoints")<CR>
- nmap <silent> L :call gdb("info locals")<CR>
- nmap <silent> A :call gdb("info args")<CR>
- nmap <silent> S :call gdb("step")<CR>
- nmap <silent> I :call gdb("stepi")<CR>
- nmap <silent> <C-N> :call gdb("next")<CR>
- nmap <silent> X :call gdb("nexti")<CR>
- nmap <silent> F :call gdb("finish")<CR>
- nmap <silent> R :call gdb("run")<CR>
- nmap <silent> Q :call gdb("quit")<CR>
- nmap <silent> C :call gdb("continue")<CR>
- nmap <silent> W :call gdb("where")<CR>
- nmap <silent> <C-U> :call gdb("up")<CR>
- nmap <silent> <C-D> :call gdb("down")<CR>
- " set/clear bp at current line
- nmap <silent> <C-B> :call <SID>Breakpoint("break")<CR>
- nmap <silent> <C-E> :call <SID>Breakpoint("clear")<CR>
- " print value at cursor
- nmap <silent> <C-P> :call gdb("print " . expand("<cword>"))<CR>
- " display Visual selected expression
- vmap <silent> <C-P> y:call gdb("createvar " . "<C-R>"")<CR>
- " print value referenced by word at cursor
- nmap <silent> <C-X> :call gdb("print *" . expand("<cword>"))<CR>
- echohl ErrorMsg
- echo "gdb keys mapped"
- echohl None
- " Restore vim defaults
- else
- let s:gdb_k = 1
- " easwy add
- call gdb("quit")
- " end easwy
- "
- nunmap <Space>
- nunmap <C-Z>
- nunmap B
- nunmap L
- nunmap A
- nunmap S
- nunmap I
- nunmap <C-N>
- nunmap X
- nunmap F
- nunmap R
- nunmap Q
- nunmap C
- nunmap W
- nunmap <C-U>
- nunmap <C-D>
- nunmap <C-B>
- nunmap <C-E>
- nunmap <C-P>
- nunmap <C-X>
- echohl ErrorMsg
- echo "gdb keys reset to default"
- echohl None
- endif
- endfunction
- " Run cmd on the current line in assembly or symbolic source code
- " parameter cmd may be 'break' or 'clear'
- function! s:Breakpoint(cmd)
- " An asm buffer (a 'nofile')
- if &buftype == "nofile"
- " line start with address 0xhhhh...
- let s = substitute(getline("."), "^\\s*\\(0x\\x\\+\\).*{1}quot;, "*\\1", "")
- if s != "*"
- call gdb(a:cmd . " " . s)
- endif
- " A source file
- else
- let s = "\"" . fnamemodify(expand("%"), ":p") . ":" . line(".") . "\""
- call gdb(a:cmd . " " . s)
- endif
- endfunction
- " map vimGdb keys
- "call s:Toggle()