VIM(pronounced /vi:m/)——Vi IMproved的缩写,是一款在多平台上均表现出色、能够令我们事半功倍的文本编辑器。《程序员修炼之道》(The Pragmatic Programmer: From Journeyman to Master)一书上教导我们,掌握一款能够在多平台上功能强大的文本编辑器的必要性。可能对程序员来说,没有比一款得心应手的文本编辑器更重要的工具了吧:-)
我第一次用VIM应该是初学Linux的时候,算算也已经4、5年了。曾经尝试过另一个大神级的editor——Emacs,但显然本人木有达到大神的境界...还是VIM比较通俗易懂一些,所以渐渐就Stick到VIM了。不可否认,相对于一些“现代”的GUI Oriented的文本编辑器,如Notepad++、UltraEdit等,VIM的学习曲线是比较陡峭的(虽然比起Emacs个人觉得要容易许多,当然这因人而异),这也是阻止许多童鞋接触VIM的主要原因。事实上,也有许多博客在宣传VIM方面做了很多工作,比如善用佳软。
我在学习VIM的过程中看过许多Tutorial、参考过许多博客,当然自己也在使用中积累了一些经验。最近发现有一些有趣的技巧一段时间不使用容易淡忘,所以决定写几篇博客,总结我认为经典而且实用的VIM技巧,一方面分享使用VIM的经验,一方面也让自己整理一下过去所掌握的技巧,所谓温故而知新。因为参考了许多地方,如果文中有没有引用到原文的地方,请原作见谅。
絮絮叨叨了许多,下面就进入正题吧。因为VIM相关的内容比较多,一篇文章中很难细说,所以暂时打算分为四个部分来写。
- VIM basic skills
- VIM customizing your vimrc
- VIM plugins
- VIM advanced topics
难度由浅至深,今天从第一部分开始,也就是介绍一些比较实用的基础VIM编辑技巧。正如开头所说,本人远非“大师”或者“大神”,只是总结自己的经验,如有出错之处,请指出。
VIM Basic Skills
考虑有些接触VIM较少的童鞋,我觉得有必要从最基础的知识开始讲起。其实学习VIM的最佳途径是阅读它自带的Help文档,但是由于这个Help是英文的(也有中文汉化)而且它比较长,所以我就把其中我认为最重要的内容提取出来,再加上一些文档中没有集中提到的有用的技巧。
VIM编辑模式
和大部分文本编辑器不同,VIM编辑器存在许多种工作模式,这也是很多第一次接触VIM的童鞋连如何输入字符都不知道的原因。
所以在开始学习VIM之前,必须要对它的常见工作模式有所了解。在VIM的帮助文档中总共提到了7种模式,我主要介绍其中常用的4种:
- Normal Mode,普通模式
- Insert Mode,插入模式
- Cmdline Mode,命令行模式
- Visual Mode,选择模式
Normal模式
VIM启动之后,默认的工作状态就是处于Normal模式。在任何时候,你都能通过按两下"Esc"键回到Normal模式。在这种模式下,用户的输入将被VIM解释为VIM功能键。所以启动VIM之后,直接在里面输入文字是不行的。我们需要从Normal模式转换到Insert模式,才能进行输入。
Insert模式
这是我们进行文本编辑的时候所使用的模式,在这种模式下,我们就能够输入文本了。从Normal模式转换到Insert模式一般有如下几种方法:
- 按i键(insert),在当前位置插入新文本
- 按a键(append),在当前位置后添加新文本
- 按A键,在当前行的末尾插入新文本
- 按I键,在当前行的开始插入新文本
- 按o键,在当前行的下一行插入一行
- 按O键,在当前行的上一行插入一行
Cmdline模式
这是用于输入命令的一种模式,在Normal模式下切换成Cmdline模式的方法有三种
- 按:键,进入命令输入模式,可以输入一些VIM中定义的函数,比如:help就可以查看VIM的帮助文档
- 按/键,进行正向搜索,比如/hello,就可以搜索当前文本中出现的下一个hello字符串
- 按?键,进行前向搜索,比如?hello,就可以搜索当前文本中出现的上一个hello字符串
Visual模式
这是用于选择一块文本的模式,切换方法是,在Normal模式下按"v"键。进入Visual Mode之后,通过移动光标,可以选中光标所经过的区域。
用一张图来总结VIM的四种模式。
在VIM中移动光标
在了解了上面几种模式之后,再来了解一下如何在VIM中移动光标。其实说白了,文本编辑就是不断的移动光标和插入文本,所以是否能高效得移动光标是一个文本编辑器成功与否的关键特性。
想要移动光标,先进入Normal模式。在Normal模式中,h, j, k, l,四个键分别代表了“左”,“下”,“上”,“右”。虽然一开始会觉得很奇怪,但使用习惯之后,用hjkl来移动光标绝对比用光标键来的高效。
当然如果只能进行上下左右四种移动,那可体现不出VIM的优势,VIM中还提供了许多能提高效率的移动方法。
- 输入数字N,比如24,然后按<c-g>(也就是control + g组合键,下文以此类推),可以直接跳转到第N行
- <c-f>和<c-b>就可以向前、向后翻页
- ^键可以将光标移动至行首,$键可以将光标移动至行末
- w键移动至下一个单词,e键移动到当前光标所在单词的最后一个字母,b键移动到当前光标所在单词的第一个字母
- gg(按两下g)就能回到文件开头,<s-g>(shift+g)能回到文件末尾
另外在VIM的Normal模式中的命令基本上都可以通过如下办法重复多次:先输入希望重复的次数,再输入具体命令。比如我希望光标向下移动10行,就可以在Normal模式下,先输入10,再按j键。又比如希望光标向后移动5个单词,可以先输入5,然后按w。诸如此类,可以举一反三。
除此之外,VIM还提供了一些方便程序员的导航功能,比如
- 按%键能够在匹配括号间跳转
- 按{和}可以跳转到下一个函数和上一个函数
- 按gd可以跳转到函数定义
还有许许多多的快捷移动方式,需要在不断的使用过程中熟悉和体会。
Copy & Paste
这年头复制粘贴简直是必须要有的功能啊~当然VIM也不会少。
为了进行复制,我们先要选中希望复制的内容,所以,首先通过Visual Mode选中需要复制的内容。记得按"v"键进入Visual Mode,然后用刚才说的移动命令选中希望复制的内容,如下图。
然后按y键,这样,选中的内容就被复制下来了。再移动光标到希望粘贴的地方,按p键,完成。
当然,Visual Mode还有其他几种方便我们选择的进入方法,比如
- 按<s-v>,就进入了行选择模式,每次可以选中一行。
- 按<c-v>,就进入了块选择模式,每次可以选中一个方块的内容。
这些都是很有用的选择方式,可以动手试试。
有童鞋经常会碰到这样的问题,在VIM中复制的内容,在其他程序中按Control-v并不能粘贴出来,这是因为VIM默认的Copy操作不会把复制的内容保存到OS的剪贴板中去。我们只需要在复制的时候,用("+y)三个键(一个引号,一个加号和一个y)进行操作就可以了,同样,用("+p)三个键就能把剪贴板中的内容粘贴到VIM中来。
编辑命令
除了能够输入文字,编辑文档也是很重要的功能。最常用的有两个功能:
- 替换某个字母:将光标移动到希望替换的字母下,按r键,再输入你希望替换的字母
- 剪切某块内容:通过Visual模式,选中希望剪切的部分,然后按x键,就能把选中的部分剪切到剪贴板中。这里有一个非常有用的技巧,有时候我们经常会把两个字母的顺序打错,比如:把refer打成了refre,我们希望把re两个字母的位置交换一下,可以先把光标移动到re中的r字符上,然后直接按"xp"两个键,re就变成er了~
Undo & Redo
今天最后一个内容是如何在VIM里面进行撤销和重做。很简单,在Normal模式下,按"u"键就是撤销,按<c-r>就是重做。
End of Episode 1
好啦,内容已经够多了,今天就先到这里,有兴趣的童鞋要装一个VIM,然后多多操练。下次继续吧~
下次的内容有:
- Searching & Replacing
- Mark
- Buffers
- Split Windows
最后附上一份经典的Cheat Sheet,对不熟悉VIM的童鞋帮助很大哦。
http://www.viemu.com/vi-vim-cheat-sheet.gif
http://www.tuxfiles.org/linuxhelp/vimcheat.html


08:49, 2010-04-14任平生 /
我一直被 VIM 的繁多的命令吓到,只在正则替换的时候才用用...
08:52, 2010-04-14任平生 /
ps. 如果不是很需要 Feed 的追踪统计功能的话,还是关掉吧, feedproxy.google.com/~r/lync-in/~3/oL65ibBXwnM/ 的地址需要翻墙
09:18, 2010-04-14Chris /
@任平生
Windows下的VIM默认配置是支持鼠标操作+大部分Windows常用命令的~比如C-C, C-V这种。主要是界面原始了一些,吓到了很多人@@我现在基本用它替代Notepad。尝试过一段时间Notepad++,觉得还是不够强大。说到命令...Emacs的真是吓到我了,哈哈:)
17:14, 2010-04-15zhy /
哪天进Ubuntu用VIM的时候再来看看你这文章
22:30, 2010-04-15Chris /
@zhy
呵呵,谢谢关注~我这篇文章也是写的比较粗略,时间比较有限,而且自己接触VIM的时间也不算特别长。有什么问题可以直接留言提问,以后还会更新新的VIM相关内容,继续关注哦
18:56, 2010-06-12Justice /
你准备烂尾了吗 =.=