一、VIM的历史 1976年左右Bill Joy开发了vi,他也是伯克利大学的毕业生,后来他跟其他人一起成立了Sun Microsystems公司并成为了Sun的首席科学家。一开始Bill开发了ex,尔后开发了vi作为ex的visual interface,也就是说vi允许一次能看到一屏的文本而非一行,vi也因此得名。 “早期,当键盘和视频终端成为最新的计算机交互手段时,人们开发了VI。那时候的键盘不具有目前熟悉的全部功能键,所以,VI就设计成只需要打字机的键盘加上退出键就能完成对文本的输入和修改(现在有的还接受一些其他的键输入方式,如光标控制键)。尽管看起来受了限制,不能充分利用现代键盘新增的许多键,可是‘祸中有福’,限制带来的好处是手指不离开打字区就能完成所有的编辑工作。” 技术不断进步,需求也在不断提高,VI的各种变种也不断涌现,知名的有nvi,elvis,VIM,vile,yzis,其中移植性最好、特性最多、使用最广的当属VIM,VIM主要是Bram Moolenaar开发的。最初Bram在Amiga计算机上改进一个叫Stevie的VI版本,他称之为“Vi IMitation”。随着功能的逐渐丰富,VIM的含义也就改成了“Vi IMproved”。相比原始的VI,VIM增加的一项最重要的功能便是多级撤销,VI只支持一级撤销。 [separator] 二、VI/VIM基础知识 很多人应该都知道VI是个有模式的编辑器:编辑模式和命令模式,按ESC回到命令模式,用i或者a进入编辑模式,由于区分了模式,导致VI的命令非常简洁,而无模式编辑器比如Emacs,所有的命令都需要加上控制键Ctrl或Alt。
VI继承了ed的理念,另外也有历史原因,VI追求的是快捷——启动程序迅速,编辑文本高效,功能专注,而Emacs追求的是功能的丰富强大以及集成带来的方便。 在VIM里头:help mode可以看到VIM的所有模式,主要有如下几种:
从VI/VIM中退出:按ESC确认返回到Normal mode,然后
VI的命令是非常具有美感的,下面是几个例子:
类似的还有b,B,ge,gE,w,W,e,E,f,F,t,T,这些命令都可以用:help cmdname查到帮助。
类似ed,VI/VIM的命令大多都可以带一个数字前缀或者一个数字范围,比如:
d<motion>,y<motion>,c<motion>,v<motion>分别代表删除/拷贝/修改/选择<motion> 命令指定的范围,比如 将光标放在{处,然后输入v%就可以把大括号中内容选定,然后按=就可以按照C语言格式缩排(:help =可以看到=命令的描述),%命令的作用是跳到匹配处,比如括号之间,C的宏指令#if #else #endif之间。 int some_ugly_modifier and some_ugly_name (void) dG可以从当前位置一直删除到文件末尾,因为G的作用是跳到文件最后一行。 VIM的命令可以非常快捷的做到一些复杂的编辑操作。
命令解释如下:
三、编程辅助 既然是程序员的编辑器,自然要show一下它的编程辅助功能。 (1) ctags,cscope 现在的IDE都提供了类、函数的索引功能,可以方便的找到某个类或者函数的在哪里定义的,VIM这方面可以利用ctags、cscope做到, Exuberant ctags支持的语言种类非常多,UltraEdit的tags功能也是利用的ctags。cscope只支持C,它能实现Source Insight的一些功能,比如查找某个函数调用了哪些函数,某个函数被哪些函数调用。VIM对这两个工具集成的非常好,利用它们就可以在源文件中方便的跳转搜索类和函数了。 Reference:
(2)multi window,multi buffer,multi tab page 一个buffer对应一个文件,它可以对应多个window,这样可以方便的对照编辑一个文件的不同部分,tab page跟现在许多编辑器上常见的标签页意义并不一样,可以将tab page理解为一个windows的容器,这样如果想新建一个窗口编辑文件但又不想打乱现在的多窗口布局,那么就可以新开一个tab page,把新窗口放到这个新的tab page里头。tab page是VIM 7.0不久前新增的特性,目前VIM 7.0还未正式发布。(此文发表至PConline时,已经正式发布。)
(3) 语法高亮 VIM发行版里带了450多种语言的语法高亮,在其主页vim.org上还可以找到更多。
(4) 自动缩进 在打开自动缩进选项后,VIM会自动的控制缩进,比如输入{自动向右缩进一个tab字符(具体用什么缩进可以配置),输入}自动回退缩进。使用=命令可以对选择的程序块排版缩进,这对于整理代码非常有帮助。另外对选择的块用>>和<<命令可以很方便的控制一个程序块的缩进。
(5) 类和函数列表 taglist等插件可以提供很方便的类和函数列表功能。 (6) 自动完成 VIM在Insert mode下输入一个单词的前几个字符,然后用Ctrl-p或者Ctrl-n就可以列出以这些字符开头的单词,特别在配置了ctags后也能列出头文件中的符号,特别方便,除此外VIM还有行自动完成、文件名自动完成等,这点即使是现在强大的IDE也未免不足。 如果设置了如下选项:
则在命令行打开文件或者输入命令时按Tab(以输入字符为前缀补全)或者Ctrl-d(列出包含输入字符的所有匹配项目)自动补全,这一功能大大降低了VIM的使用难度。 另外有许多插件可以实现许多IDE中的自动完成类成员的功能,当然,这个功能还比不上Eclispe、Visual Studio等IDE中的强大,这一点是VIM比较可惜的地方。VIM 7.0引入了Omni Completion,可以自定义匹配完成函数,也许可以弥补这个缺陷。
(7) folding VIM支持折叠代码,还可以根据文件中特殊的标记对文件中的行折叠,可以实现Outline视图,这可以极大的方便编辑很大的文件。 Reference: :help fold (8) quickfix 许多人对于UNIX开发的印象都是“编辑代码,退出编辑器,编译,发现错误,记录出错信息,遍辑代码,退出编辑器,编译,用gdb调试,再编辑代码……”,这是古老的VI时代的事情了,有了VIM的quickfix特性,可以在VIM里编译然后直接跳到编译出错的行,这个反复的过程无需退出编辑器,而且VIM的quickfix特性可以经配置后支持不同的编译器以及不同的语言:只要编译器在出错信息里包含文件名和行号。 不过比较遗憾的是VIM对于集成调试支持还不好,有些项目尝试集成GDB到VIM,比如http://skawina.eu.org/mikolaj/vimgdb/和http://www.volny.cz/zellerin/gdbvim/,在http://www.vim.org/search.php中的scripts处搜索gdb也可以找到一些插件.这方面Emacs的GUD(Grand Unified Debugger)调试界面要更强大,毕竟GCC/GDB/Emacs是一家。 Reference: :help quickfix (9)auto command VIM可以在某些事件发生时比如打开文件、保存文件、切换窗口时自动执行一些VIM命令,VIM的许多插件都利用了这个功能。常用的一种情况是把某种文件后缀指定到一种文件格式上,比如*.jv指定到Java文件格式,这样在每次打开.jv类型的文件时自动使用Java的语法高亮: :autocmd BufNewFile, BufRead *.jv :set ft=Java Reference: :help autocmd.txt (10)mode line 在编辑文件时常常指定一些选项,比如缩进量、是否将制表符转换成空格等,每次手动指定这些选项很麻烦,写到vimrc中却又成了全局选项,而且换了一份 VIM,原有的设置就丢失了。VIM可以识别文件中的特殊行,自动设置一些选项,下面是写在C源文件开头的一个mode line示例:
四、强大方便的帮助系统 使用了那么多软件,只有VIM和Emacs的帮助系统给笔者方便快捷的感觉,大部分软件的帮助往往是摆设而已,而VIM的帮助的确是考虑到了自己“help”的身份,利用它能很方便容易的找到想要的东西。 VIM的帮助是超链接形式的,它使用的就是tags,所以可以跟ctags功能一样按Ctrl-]跳转到链接所指处,按Ctrl-t返回。
如果你记不清命令或者选项的全称,那么可以利用Tab或者Ctrl-d的自动补全功能。 :help options 可以找到所有的选项说明 查看某一个选项的值(实际上选项是VIM中的一种变量,类似SHELL的变量以$符号引用,VIM的选项以&引用,另外VIM的寄存器以@引用): :echo &tabstop 五、其它高级功能 (1)寄存器 VIM里面的寄存器可以用来保存拷贝的文本、记录的宏、设置的书签等等,一般的编辑器都只有一个剪切板(MS Office加入了多个剪切板),而VIM和Emacs编辑器中的多寄存器可以实现多个剪切板的功能。VIM中有九类寄存器:
使用:reg命令可以看到所有寄存器中的内容,使用"+y或者"*y可以将visual mode下选择 Reference: :help registers (2) 宏 Reference: :help q (3) 书签 Normal mode下按m<reg>作书签,<reg>指26个命名寄存器中的一个,然后可以用'<reg>或者`<reg>跳到书签处。 Reference: :help m (4) 映射 VI/VIM可以将某个按键序列映射到一个命令序列上,比如在配置文件.vimrc(Windows下是_vimrc)中写入 map <F6> <ESC>i<C-R>=strftime("%Y-%m-%d")<ESC><ESC> 即可以在Normal mode下插入当前日期。 Reference: :help :map (5) 缩写 VI/VIM支持用一个缩写字符串代替一个长的字符串,比如 :ab hw hello world 然后在Insert mode下输入“hw ”(不包括引号)后VIM就自动替换成了“hello world”。这里展示一个Emacs下abbrev功能的动画(没错,是Emacs的): http://www.bloomington.in.us/~brutt/msf-abbrev.html Reference: :help :ab (6) :s//和:g//,:!g// 这两个命名加上正则表达式,常常能完成非常复杂的编辑任务,可以毫不夸张地说是VIM的两柄瑞士军刀。:s是替换操作,:g是查找匹配模式的行,:!g是查找不匹配模式的行。 http://www.vim.org/tips/tip.php?tip_id=1063这个tip可以把:g找到的行拷贝到一个新的缓冲区中,非常有用。
(7) 插件 VIM自己有脚本语言,另外也支持用Perl/Python/Tcl/Ruby/Scheme编写插件,这些插件极大的丰富了VIM的功能。 (8) color scheme VIM有许多配色方案,下面这个链接有许多配色方案效果的图样:http://www.cs.cmu.edu/~maverick/VimColorSchemeTest/ (9) 二进制编辑 VIM可以利用xxd实现二进制编辑,不过这项功能还是不够好用。 (10) sign sign指在编辑窗口的最左列显示一个标记,利用这个功能能实现很多IDE中的书签标记或者断点标记。 Reference: :help sign 六、VIM Scripts VIM script包含几大类:
VIM的script安装非常简单,下载的script文件或者压缩包里头都有安装说明,在VIM的安装目录(比如C:/VIM64)下面有一个 vimfiles目录,把script放到vimfiles目录下即可。对于多用户系统,可以在HOME目录(一般是c:/Documents and Settings<USER_NAME>/)下面建立一个vimfiles目录,把script放置到这里。 下面是一些好用的VIM插件,具体使用办法请参考各自。vim文件头部的注释。 BufExplorer.vim ***** Taglist.vim ***** TabBar.vim *** minibufexpl.vim *** c.vim *** CRefVim ** latex-suite ***** word_complete.vim *** Vim JDE cppcomplete.vim ** The NEAD Commenter ** winmanager sketch.vim *** DrawIt.vim ** MultipleSearch *** SearchComplete.vim * Vim Intellisense project JavaBrower vimspell cream IComplete 七、VIM资源
几个学习正则表达式的工具(from happyvim at newsmth)
http://www.yzis.org/ yzis是一个新的VI变种,它支持变宽字体,目前功能还不够丰富。 http://ex-vi.sourceforge.net/ 传统VI的源代码 八、编译安装最新CVS版的VIM 1. 获取源代码 cvs -z3 -d:pserver:anonymous@cvs.sf.net:/cvsroot/vim co vim7 源代码位于当前目录的vim7目录下面,假设安装目标在d:/work/program/Vim/vim70b 2.编译 注意重新编译前最好clean一下,确保“*obj*”目录被删除了,否则可能出现莫名其妙的问题,比如链接时找不到一些函数。下面是一个批处理脚本: rem ---------------------------------------------> 对于MinGW, @echo off 如果发现MinGW编译出来的gvimd.exe非常大(约4~5MB),可以用MinGW自带的strip处理一下。 3. 安装 如果你的系统先前有一份不同版本的VIM,那么需要先卸载掉(运行vim/vimXX/uninstal.exe,或者在拷贝完文件后运行新版VIM的 install.exe,它也会提示卸载旧版本),最近的VIM 7 CVS代码安装目录也从vim70aa转变到vim70b,也需要卸载原先的vim70aa,这一步主要是删除一些注册表项。 如果你从CVS上更新代码后,install要求的安装目录名字没有改变(也就是说VIM版本没变),那么不需要卸载原先的版本,直接拷贝文件覆盖即可,如果你想更改目录安装的话也需要卸载。 cd vim7 然后进入vim70b目录运行install.exe,如果发现一个DOS窗口一闪而逝,那么很可能是建立的vim70b目录名不对,比如笔者前几天升级后使用的仍然是vim70aa目录名,在DOS窗口中运行install.exe它就提示需要在vim70b目录下运行,将vim70aa改名即可。 install.exe的源代码是vim7/src/dosinst.c,这里面修改了注册表,并拷贝一些文件到WINDOWS目录下等等。 4.善后 视情况你需要更新PATH环境变量、文件关联、_vimrc中的路径名等,并将diff.exe,ctags.exe,cscope.exe拷贝到vim70b下面。 最后运行gvimd.exe,键入:ver开始享受VIM吧。 九、一份vimrc配置文件(注:原文如此,不太清楚作者所要表达的信息) 十、VIM的不足 前面已经提到,VIM在自动完成和集成调试方面还比不上现代的许多IDE,另外VIM对二进制编辑还没有UltraEdit强大,对于现在流行的重构, VIM也支持不力,但是作为一个文本编辑器而言,堪比的只有Emacs,另外Visual SlickEdit也很强大,不过它是商业软件。VIM也可以嵌入到Visual Studio中作为编辑器,另外Code Forge,Eclipse,NetBeans,Sun Visual Workshop等也提供了一定的VIM支持或者键绑定。
|