沈阳虎跃快客时刻表:代码编辑神器VIM(附我写acm程序时的配置)

来源:百度文库 编辑:中财网 时间:2024/04/30 17:14:14

[置顶]代码编辑神器VIM(附我写acm程序时的配置)

分类: 工具软件 2011-08-15 23:27 373人阅读 评论(0) 收藏 举报

    有些牛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

在 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 目录。参考其中的内容

           #cursor#    

应该很容易理解。比如需要新建 python 模板。则在 g:TemplatePath 中建立 python.tpl 并加入#cursor# 的位置即可。

 

3.我写acm程序的配置

先说明具体想要达到的功能:

  1. 快速从模版新建c++文件。开头那些include什么的就不用写了。(上面介绍的模版已实现)
  2. 按一下按键把粘贴板的内容(测试数据保存到指定文件)。
  3. 按一下按键编译,按一下按键自动运行(输入重定向到那个测试数据文件)。
  4. gdb调试(这东西涉及进程通讯,所以要通过对源码打补丁,再重新编译,不能直接通过插件安装,我猜想应该是这样)
第二点。配置如下:

view plain

  1. map  :call SaveInputData()  
  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,一样环保!

最后我们这些下面的设置就能一键运行了:

view plain

  1. map  :call ExecCpp()  
  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调试。当然编译时会加调试信息的。

view plain

  1. -g  
  2. 加入调试代码,可以在完成后使用 strip命令删除用于调试的信息   


well蛋!


附录:

推荐一篇好文章

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

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

 

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

view plain
  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  
  33.   
  34. filetype plugin indent on  
  35. set completeopt=longest,menu  
  36.   
  37. let g:SuperTabRetainCompletionType=2  
  38. let g:SuperTabDefaultCompletionType=""  
  39.   
  40.   
  41. map  :w:make  
  42. imap  :w:make  
  43.   
  44. "map  :call CompileCpp()  
  45. "func! CompileCpp()  
  46. "exec "w"  
  47. "exec "!g++ -g % -o /tmp/a"  
  48. "endfunc  
  49.   
  50. map  :call ExecCpp()  
  51. func! ExecCpp()  
  52. exec "!/tmp/a < /tmp/input_data"  
  53. endfunc  
  54.   
  55. map  :call SaveInputData()  
  56. func! SaveInputData()  
  57. exec "tabnew"  
  58. exec 'normal "+gP'  
  59. exec "w! /tmp/input_data"  
  60. endfunc  
  61.   
  62. map  :call RunPython()  
  63. func! RunPython()  
  64. exec "w"  
  65. exec "!python %"  
  66. endfunc  
  67.   
  68.   
  69. "source $VIMRUNTIME/mswin.vim  
  70. "behave mswin  
  71.   
  72. map  NewTemplateTab cpp  
  73. map  NewTemplateTab python  
  74.   
  75. "map nn :NewTemplateTab cpp  
  76. "map np :NewTemplateTab python  
  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  :cn  
  84. autocmd FileType cpp nmap  :cp  
  85. color tango-desert  
  86.   
  87. :inoremap ( ()i  
  88. :inoremap ) =ClosePair(')')  
  89. :inoremap { {}O  
  90. :inoremap } =ClosePair('}')  
  91. :inoremap [ []i  
  92. :inoremap ] =ClosePair(']')  
  93. ":inoremap " ""i  
  94. ":inoremap ' ''i  
  95.   
  96. function ClosePair(char)  
  97.   if getline('.')[col('.') - 1] == a:char  
  98.       return "\"  
  99.   else  
  100.       return a:char  
  101.   endif  
  102. endfunction  
  103.   
  104. nmap  "+gP  
  105. imap  i  
  106. vmap  "+y  
  107. vmap  "+gP  
  108.   
  109. nmap  gt  
  110. imap  gt  
  111.   
  112. nmap  gT  
  113. imap  gT  
  114.   
  115. nmap  :w!  
  116. imap  :w!  
  117.   
  118. map  ggVG  

~/.vim/macros/gdb_mappings.vim
view plain
  1. " Mappings example for use with gdb  
  2. " Maintainer:     
  3. " Last Change:  Mar 6 2006  
  4.   
  5. if ! has("gdb")  
  6.     finish  
  7. endif  
  8.   
  9. let s:gdb_k = 1  
  10. map  :call Toggle()  
  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  :call gdb("")  
  29.     nmap   :call gdb("\032")  
  30.   
  31.     nmap  B :call gdb("info breakpoints")  
  32.     nmap  L :call gdb("info locals")  
  33.     nmap  A :call gdb("info args")  
  34.     nmap  S :call gdb("step")  
  35.     nmap  I :call gdb("stepi")  
  36.     nmap   :call gdb("next")  
  37.     nmap  X :call gdb("nexti")  
  38.     nmap  F :call gdb("finish")  
  39.     nmap  R :call gdb("run")  
  40.     nmap  Q :call gdb("quit")  
  41.     nmap  C :call gdb("continue")  
  42.     nmap  W :call gdb("where")  
  43.     nmap   :call gdb("up")  
  44.     nmap   :call gdb("down")  
  45.   
  46.     " set/clear bp at current line  
  47.     nmap   :call Breakpoint("break")  
  48.     nmap   :call Breakpoint("clear")  
  49.   
  50.     " print value at cursor  
  51.     nmap   :call gdb("print " . expand(""))  
  52.   
  53.     " display Visual selected expression  
  54.     vmap   y:call gdb("createvar " . """)  
  55.   
  56.     " print value referenced by word at cursor  
  57.     nmap   :call gdb("print *" . expand(""))  
  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   
  71.     nunmap   
  72.   
  73.     nunmap B  
  74.     nunmap L  
  75.     nunmap A  
  76.     nunmap S  
  77.     nunmap I  
  78.     nunmap   
  79.     nunmap X  
  80.     nunmap F  
  81.     nunmap R  
  82.     nunmap Q  
  83.     nunmap C  
  84.     nunmap W  
  85.     nunmap   
  86.     nunmap   
  87.   
  88.     nunmap   
  89.     nunmap   
  90.     nunmap   
  91.     nunmap   
  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()  

谁知道ACM历次的程序源代码? 哪位能指导我参加ACM的? 谁会用MATLAB编一段形成节点导纳矩阵的程序,要求附代码 ACM是什么样的程序?有什么用? 自己写的歌 想自己制作伴奏 有可以制作伴奏的软件吗?哪里能下载 VIM 2 ? 题目一:售票处的服务系统 高手能帮我写这个程序的代码吗 题目一:售票处的服务系统 高手能帮我写这个程序的代码吗 在编辑网页时,写哪些代码别人才看不到你的源文件或者不能用右键的呢?? !!!在编辑网页时,写哪些代码别人才看不到你的源文件或者不能用右键的呢?? fpl后缀的是什么代码写的网站程序? PHP代码如何调用一个自己写的命令行程序 谁是ACM的高手??? 跪求魔兽世界风云神器的代码!!!谢谢啦 我的本本为什么不能开机了?(附代码,请专业大侠帮助) 我的本本为什么不能开机了?(附代码,请专业人事帮助) 我的本本为什么不能开机了?(附代码,请专业人事帮助) 我的本本为什么不能开机了?(附代码,请专业人事帮助) ASP编辑搜索引擎的代码 我现在正在做网页,需要记录访客的程序,谁能帮我写吗?不要ASP,NET代码 VS2005下,gidview里当前行编辑状态下,更新按钮的代码怎么写? VS2005下,gidview里当前行编辑状态下,更新按钮的代码怎么写? 我的DreamWeaver现在是代码编辑模式了,我想改成图象编辑模式,怎样改? 博客的HTML代码怎么编辑?编辑了会怎么样,我新手 我有个题目 写一个xml解析的java程序 从一段html代码里解析取出一个语句