代碼編輯神器VIM(附我寫acm程序時的配置)(轉)


本文轉自: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高級程序員"  行列。畢竟這東西名氣這么大,應該名不虛傳吧。不花精力研究一下,恐怕就要錯失一個好東東了。


自己使用后的體驗:

  1. 手不用離開鍵盤,比較方便。不過因為我自己的Thinkpad筆記本帶有小紅帽,我后來基本就用那個,不用鼠標,確實手要離開鍵盤比較不方便。可能vim的一些特性優勢就沒有那么明顯了。
  2. 按鍵的兼容問題。大部分人肯定都像我一樣,win中毒很深,用ctrl+c,ctrl+v復制粘貼。但linux里面ctrl+c是interrupt signal。vim里面還有好幾個寄存器,搞得想從系統粘貼還要按好多個鍵,我是受不了。當然,由於vim強大的自定義功能,按鍵可以自定義,改到自己合用。而win版的gvim已經更改好按鍵了。

個人認為最好的入門方法:

  1. 先明白vi有兩種模式:命令模式和插入模式,按 i 進入插入模式,可進行一般的編輯;按 ESC 回到命令模式。其實還有一種是可視模式啦,按v。
  2. Vim命令速查卡!!(鏈接萬一掛掉就自己搜吧)http://coolshell.cn/articles/150.html,這個版本直接打印會有問題,因為不是標准的A4,所以只打印出中間的一塊,可以用我改好的版本http://ishare.iask.sina.com.cn/f/15406711.html

自己玩一下,先熟悉基本的編輯功能。


vim的擴展基本就是插件和快捷鍵映射,用gvim的話可以在菜單找到啟動設定,會自動打開啟動配置文件,在linux下是~/.vimrc


Vim進階設置 


1.配色

使用vim肯定要選一個自己喜歡的代碼高亮配色。
  1. 在線查看並下載(推薦這個) http://code.google.com/p/vimcolorschemetest/
  2. 打包下載,在 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程序的配置

先說明具體想要達到的功能:

  1. 快速從模版新建c++文件。開頭那些include什么的就不用寫了。(上面介紹的模版已實現)
  2. 按一下按鍵把粘貼板的內容(測試數據保存到指定文件)。
  3. 按一下按鍵編譯,按一下按鍵自動運行(輸入重定向到那個測試數據文件)。
  4. gdb調試(這東西涉及進程通訊,所以要通過對源碼打補丁,再重新編譯,不能直接通過插件安裝,我猜想應該是這樣)
第二點。配置如下:

[plain]  view plain copy
  1. map <F9> :call SaveInputData()<CR>  
  2. func! SaveInputData()  
  3. exec "tabnew"  
  4. exec 'normal "+gP'  
  5. exec "w! /tmp/input_data"  
  6. endfunc  

按F9之后,會新打開一個tab,然后在正常模式執行“+gP,也就是粘貼,接着w!強制寫入到/tmp/input_data文件,放到/tmp,無垃圾,綠色環保!

第三點:

網上一般介紹用按鍵映射gcc編譯命令,但這樣會有問題,就是無法使用quickfix窗口(參看附錄那篇文章的介紹),也就是出錯后我們可以打開quickfix窗口顯示出錯信息,而不是切換回編輯模式那些出錯信息就沒了,而且支持直接跳轉到出錯代碼行。

我們把按鍵映射到命令:make即可。而make是根據set makeprg=g++\ %\ -o\ /tmp/a   自動設置編譯參數的。生成到/tmp/a,一樣環保!

最后我們這些下面的設置就能一鍵運行了:

[plain]  view plain copy
  1. map <F6> :call ExecCpp()<CR>  
  2. func! ExecCpp()  
  3. exec "!/tmp/a < /tmp/input_data"  
  4. 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調試。當然編譯時會加調試信息的。

[plain]  view plain copy
  1. -g  
  2. 加入調試代碼,可以在完成后使用 strip命令刪除用於調試的信息   


well蛋!


附錄:

推薦一篇好文章

手把手教你把Vim改裝成一個IDE編程環境(圖文)

原文地址:http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx

 

我自己的 ~/.gvimrc文件(或~/.vimrc)

[plain]  view plain copy
  1. sset encoding=utf8  
  2.   
  3. let g:vimgdb_debug_file = ""  
  4. run macros/gdb_mappings.vim   
  5.   
  6. set langmenu=zh_CN.UTF-8  
  7.   
  8. set imcmdline  
  9.   
  10. source $VIMRUNTIME/delmenu.vim  
  11.   
  12. source $VIMRUNTIME/menu.vim  
  13. set backspace=indent,eol,start  
  14. set whichwrap=b,s,<,>,[,]   
  15. syntax on   
  16.   
  17. set nocompatible  
  18. set number  
  19. set cin  
  20. set autoindent  
  21. set smartindent  
  22. set tabstop=4  
  23. set shiftwidth=4  
  24. set showmatch  
  25. set et  
  26. set autochdir  
  27.   
  28. let Tlist_Show_One_File=1  
  29. let Tlist_Exit_OnlyWindow=1  
  30.   
  31. let g:winManagerWindowLayout='FileExplorer|TagList'  
  32. nmap wm :WMToggle<cr>  
  33.   
  34. filetype plugin indent on  
  35. set completeopt=longest,menu  
  36.   
  37. let g:SuperTabRetainCompletionType=2  
  38. let g:SuperTabDefaultCompletionType="<C-X><C-O>"  
  39.   
  40.   
  41. map <F5> :w<CR>:make<CR>  
  42. imap <F5> :w<CR>:make<CR>  
  43.   
  44. "map <F12> :call CompileCpp()<CR>  
  45. "func! CompileCpp()  
  46. "exec "w"  
  47. "exec "!g++ -g % -o /tmp/a"  
  48. "endfunc  
  49.   
  50. map <F6> :call ExecCpp()<CR>  
  51. func! ExecCpp()  
  52. exec "!/tmp/a < /tmp/input_data"  
  53. endfunc  
  54.   
  55. map <F9> :call SaveInputData()<CR>  
  56. func! SaveInputData()  
  57. exec "tabnew"  
  58. exec 'normal "+gP'  
  59. exec "w! /tmp/input_data"  
  60. endfunc  
  61.   
  62. map <F8> :call RunPython()<CR>  
  63. func! RunPython()  
  64. exec "w"  
  65. exec "!python %"  
  66. endfunc  
  67.   
  68.   
  69. "source $VIMRUNTIME/mswin.vim  
  70. "behave mswin  
  71.   
  72. map <A-c> NewTemplateTab cpp<cr>  
  73. map <A-p> NewTemplateTab python<cr>  
  74.   
  75. "map nn :NewTemplateTab cpp<cr>  
  76. "map np :NewTemplateTab python<cr>  
  77. autocmd FileType python setlocal et sta sw=4 sts=4  
  78.   
  79.   
  80.   
  81. let g:pydiction_location = '/home/dinosoft/.vim/pydiction/complete-dict'  
  82. set makeprg=g++\ -g\ %\ -o\ /tmp/a     
  83. autocmd FileType cpp nmap <C-N> :cn<cr>  
  84. autocmd FileType cpp nmap <C-P> :cp<cr>  
  85. color tango-desert  
  86.   
  87. :inoremap ( ()<ESC>i  
  88. :inoremap ) <c-r>=ClosePair(')')<CR>  
  89. :inoremap { {<CR>}<ESC>O  
  90. :inoremap } <c-r>=ClosePair('}')<CR>  
  91. :inoremap [ []<ESC>i  
  92. :inoremap ] <c-r>=ClosePair(']')<CR>  
  93. ":inoremap " ""<ESC>i  
  94. ":inoremap ' ''<ESC>i  
  95.   
  96. function ClosePair(char)  
  97.   if getline('.')[col('.') - 1] == a:char  
  98.       return "\<Right>"  
  99.   else  
  100.       return a:char  
  101.   endif  
  102. endfunction  
  103.   
  104. nmap <S-Insert> "+gP  
  105. imap <S-Insert> <ESC><S-Insert>i  
  106. vmap <C-C> "+y  
  107. vmap <S-Insert> "+gP  
  108.   
  109. nmap <C-left> gt  
  110. imap <C-left> gt  
  111.   
  112. nmap <C-right> gT  
  113. imap <C-right> gT  
  114.   
  115. nmap <C-S> :w!  
  116. imap <C-S> :w!  
  117.   
  118. map <C-A> ggVG  

~/.vim/macros/gdb_mappings.vim 
[plain]  view plain copy
  1. " Mappings example for use with gdb  
  2. " Maintainer:   <xdegaye at users dot sourceforge dot net>  
  3. " Last Change:  Mar 6 2006  
  4.   
  5. if ! has("gdb")  
  6.     finish  
  7. endif  
  8.   
  9. let s:gdb_k = 1  
  10. map <F7> :call <SID>Toggle()<CR>  
  11.   
  12. " Toggle between vim default and custom mappings  
  13. function! s:Toggle()  
  14.     if s:gdb_k  
  15.     let s:gdb_k = 0  
  16. " easwy add  
  17. if ! exists("g:vimgdb_debug_file")  
  18.     let g:vimgdb_debug_file = ""  
  19. elseif g:vimgdb_debug_file == ""  
  20.     call inputsave()  
  21.    let g:vimgdb_debug_file =  expand("%:r:t")  
  22.    call inputrestore()  
  23. endif  
  24. call gdb("file /tmp/a")  
  25. "call gdb("file " . g:vimgdb_debug_file)  
  26. " easwy end   
  27.   
  28.     map <Space> :call gdb("")<CR>  
  29.     nmap <silent> <C-Z> :call gdb("\032")<CR>  
  30.   
  31.     nmap <silent> B :call gdb("info breakpoints")<CR>  
  32.     nmap <silent> L :call gdb("info locals")<CR>  
  33.     nmap <silent> A :call gdb("info args")<CR>  
  34.     nmap <silent> S :call gdb("step")<CR>  
  35.     nmap <silent> I :call gdb("stepi")<CR>  
  36.     nmap <silent> <C-N> :call gdb("next")<CR>  
  37.     nmap <silent> X :call gdb("nexti")<CR>  
  38.     nmap <silent> F :call gdb("finish")<CR>  
  39.     nmap <silent> R :call gdb("run")<CR>  
  40.     nmap <silent> Q :call gdb("quit")<CR>  
  41.     nmap <silent> C :call gdb("continue")<CR>  
  42.     nmap <silent> W :call gdb("where")<CR>  
  43.     nmap <silent> <C-U> :call gdb("up")<CR>  
  44.     nmap <silent> <C-D> :call gdb("down")<CR>  
  45.   
  46.     " set/clear bp at current line  
  47.     nmap <silent> <C-B> :call <SID>Breakpoint("break")<CR>  
  48.     nmap <silent> <C-E> :call <SID>Breakpoint("clear")<CR>  
  49.   
  50.     " print value at cursor  
  51.     nmap <silent> <C-P> :call gdb("print " . expand("<cword>"))<CR>  
  52.   
  53.     " display Visual selected expression  
  54.     vmap <silent> <C-P> y:call gdb("createvar " . "<C-R>"")<CR>  
  55.   
  56.     " print value referenced by word at cursor  
  57.     nmap <silent> <C-X> :call gdb("print *" . expand("<cword>"))<CR>  
  58.   
  59.     echohl ErrorMsg  
  60.     echo "gdb keys mapped"  
  61.     echohl None  
  62.   
  63.     " Restore vim defaults  
  64.     else  
  65.     let s:gdb_k = 1  
  66. " easwy add  
  67. call gdb("quit")  
  68. " end easwy  
  69. "  
  70.     nunmap <Space>  
  71.     nunmap <C-Z>  
  72.   
  73.     nunmap B  
  74.     nunmap L  
  75.     nunmap A  
  76.     nunmap S  
  77.     nunmap I  
  78.     nunmap <C-N>  
  79.     nunmap X  
  80.     nunmap F  
  81.     nunmap R  
  82.     nunmap Q  
  83.     nunmap C  
  84.     nunmap W  
  85.     nunmap <C-U>  
  86.     nunmap <C-D>  
  87.   
  88.     nunmap <C-B>  
  89.     nunmap <C-E>  
  90.     nunmap <C-P>  
  91.     nunmap <C-X>  
  92.   
  93.     echohl ErrorMsg  
  94.     echo "gdb keys reset to default"  
  95.     echohl None  
  96.     endif  
  97. endfunction  
  98.   
  99. " Run cmd on the current line in assembly or symbolic source code  
  100. " parameter cmd may be 'break' or 'clear'  
  101. function! s:Breakpoint(cmd)  
  102.     " An asm buffer (a 'nofile')  
  103.     if &buftype == "nofile"  
  104.     " line start with address 0xhhhh...  
  105.     let s = substitute(getline("."), "^\\s*\\(0x\\x\\+\\).*{1}quot;, "*\\1", "")  
  106.     if s != "*"  
  107.         call gdb(a:cmd . " " . s)  
  108.     endif  
  109.     " A source file  
  110.     else  
  111.     let s = "\"" . fnamemodify(expand("%"), ":p") . ":" . line(".") . "\""  
  112.     call gdb(a:cmd . " " . s)  
  113.     endif  
  114. endfunction  
  115.   
  116. " map vimGdb keys  
  117. "call s:Toggle()  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM