zoukankan      html  css  js  c++  java
  • 代码编辑神器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调试(这东西涉及进程通讯,所以要通过对源码打补丁,再重新编译,不能直接通过插件安装,我猜想应该是这样)
    第二点。配置如下:

    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,一样环保!

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

    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调试。当然编译时会加调试信息的。

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


    well蛋!


    附录:

    推荐一篇好文章

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

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

     

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

    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 
    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()  
  • 相关阅读:
    proc文件系统
    sysfs文件系统
    linux 下 进程和线程的区别
    Linux内核中常见内存分配函数
    内核空间与用户空间的通信方式
    DoDataExchange函数,UpdateData(TRUE)和UpdateData(FALSE)的区别
    C# 获取文件路径
    C# WinForm 中 MessageBox的使用详解
    C#对于文件操作
    线程间操作无效: 从不是创建控件的线程访问它。
  • 原文地址:https://www.cnblogs.com/ma6174/p/2335835.html
Copyright © 2011-2022 走看看