有些牛X的人性格会比较古怪,VIM就是这么一位特立独行,难以琢磨的怪客。但如果熟悉了,你就会发现他的好。
VIM(VI,VIM,GVIM)这东西不好上手,而且是相当不好上手,基本上新手打开这个编辑器,想试着输入几个字符之后,便会很恼火地把VIM关掉。
第一次接触vim是上网找工具自动缩进代码。在网上拷的代码因为html的原因,没处理好缩进会全乱掉,手动调那会蛋疼死的。这种机械的话显然要交给机器做。上网搜了一下,居然只找到vim的方法,所以自己就下了一个,gg=G,按了几个奇怪的按键,代码就自动缩进好了。
我之前用过一下,也去看了一些资料,最后觉得这东西是历史的产物,是当年还没鼠标,图形界面不发达的产物。完完全全违反人机交互啊有木有!!所以便把VIM给抛弃了。不过最近又陆陆续续看到关于VIM的一些调侃,而且在一些IT公司的笔试题里面居然有考关于VIM的!所以我决心要好好研究一下VIM,迈入"使用VIM的装B高级程序员" 行列。毕竟这东西名气这么大,应该名不虚传吧。不花精力研究一下,恐怕就要错失一个好东东了。
自己使用后的体验:
自己玩一下,先熟悉基本的编辑功能。
vim的扩展基本就是插件和快捷键映射,用gvim的话可以在菜单找到启动设定,会自动打开启动配置文件,在linux下是~/.vimrc
原帖地址: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# 的位置即可。
先说明具体想要达到的功能:
map <F9> :call SaveInputData()<CR> func! SaveInputData() exec "tabnew" exec 'normal "+gP' exec "w! /tmp/input_data" endfunc
第三点:
网上一般介绍用按键映射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
" 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()