代码编辑神器VIM


本文转自: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调试(这东西涉及进程通讯,所以要通过对源码打补丁,再重新编译,不能直接通过插件安装,我猜想应该是这样)
第二点。配置如下:

<div bg_plain"="" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; width: 1118px; overflow: auto; padding-top: 1px; margin: 18px 0px !important; background-color: rgb(231, 229, 220);">
[plain] view plaincopy
  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 plaincopy
  1. -g  
  2. 加入调试代码,可以在完成后使用 strip命令删除用于调试的信息   


well蛋!


附录:

推荐一篇好文章

手把手教你把Vim改装成一个IDE编程环境(图文)

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

 

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

<div bg_plain"="" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; width: 1118px; overflow: auto; padding-top: 1px; margin: 18px 0px !important; background-color: rgb(231, 229, 220);">
[plain] view plaincopy
  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 
<div bg_plain"="" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; width: 1118px; overflow: auto; padding-top: 1px; margin: 18px 0px !important; background-color: rgb(231, 229, 220);">
[plain] view plaincopy
  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()  

博主ma6174对本博客文章(除转载的)享有版权,未经许可不得用于商业用途。转载请注明出处http://www.cnblogs.com/ma6174/

对文章有啥看法或建议,可以评论或发电子邮件到[email protected]


你可能感兴趣的:(代码编辑神器VIM)