前言
我们是开发者,没错。我们要开发程序,也没错。开发程序的第一个步骤就是写程序,也就是编辑源程序代码。因此,程序开发跟编辑器有关系。一个良好的编辑器能够大大的提高的你写代码的速度,也许你不相信,真的有很多的“牛人”在用Notepad(记事本)写代码。虽然现在有许多的IDE(Integrated Development Environment集成开发环境--一种能把源码的编辑,编译,调试和配置都集成在一起的开发工具集),但是公认的世界上最好的二个源代码编辑器就是Vim和Emacs。经过几十年的发展,现在它们都已经变成了一个家族,也即以Vim为代表的Vi家族,和以Emacs为代表的Emacs家族,在家族内部还有许多其他的克隆版本,而且它们都能跨平台,在各种主流的操作系统平台都有可用的版本,如Windows,Unix/Linux和Mac OS等。
我在大学三年级的时候开始接触这二个编辑器,首先的感觉就是不习惯不适应,但慢慢当过了几天后就会发现它们的强大之处和魅力所在,然后就慢慢的习惯了它们甚至喜欢上了它们。而且,在全世界范围内,特别是Unix/Linux社区,人们对这二个编辑器争论不止,各自的追随者都称自己的是最好的,吵了几十年,也没有结论,因为它们都是最好的。
个人认为,Emacs更适合于写代码和多个源码文件的管理,因为很早以前Emacs本身就是一个操作系统,它更像一个IDE,可以编辑,编译,调试和运行程序。而Vim更适合于编辑已写好的文件,因为它的移动,查找,替换是最有效率的;或者,Vim适合于应付单个源码文件(甚至有一段时间我先用Emacs写源码,然后再用Vim来修改)。后来不知道为什么,用Vim的次数比Emacs多,后来就对Vim相对熟悉一些,到现在Emacs已经有一年多没有用过了。
所以,为了不误导读者,这里只谈谈Vim的使用方法和技巧。
另外,Vim经过了这么多年的发展,又是世界上最强悍的编辑器之一,一篇博客是很难讲的很清的,所以计划分三篇来讲:
- Vim的基本使用方法和初级编辑
- 高级进阶技巧
- 网络资源和Vim Script(脚本)
这是第一篇,至于后面二篇会在以后的日子里慢慢的酝酿和总结。即使这三篇也不可能把Vim讲透彻,因为这实在是太多内容了,O'reilly有一本书叫做《Learning the Vi and Vim Editor 7th》有三四百页厚,专门来讲Vim的,也有中文版了,有兴趣的朋友,建议去买一本。也可以下载一本(学习用,不犯法,唉,学习的成本真TM低啊!要是iPhone 4S或是Nexus Prime也能随便从网上下载下来就好了,哪怕只用作学习呢!)。
说了这么多废话,现在开始进入正题。
这篇里面介绍如何获取Vim,如何安装,如何打开文件,并以最实用的方式来讲述基本的编辑命令。
注:除非特说明,本文都是在Linux(Fedora)的Terminal下面使用,所以其他平台的启动方式可能会不同。但我想不会成为问题的,必要的时候请Google。
如何获取和安装Vim
方法不尽一致,主要取决于你所用的操作系统平台,和你的个人使用习惯,也就是说你想麻烦些还是省事儿些,麻烦些通常就是下载Vim的源码包(它是开源的),然后自己编译。省事儿些就是下载自安装包或用软件维护工具(Unix/Linux)。
- Windows用户, 到官方网站下载安装包,然后像安装其他Windows软件一样“下一步”+“Okay”就安装完成了
- Mac OS用户,最好还是参考官方安装文档,或是Google一下,这个没有试过,不敢乱讲。不过,貌似Mac OS上已带有Vi的一个克隆版本,什么名字忘记了,可以去查查(等哥发达了,能买得起苹果的电脑时,一定补上这块)
- Unix/Linux用户,这个平台方式就比较多了,也比较灵活
对于如何获取和安装,也可以参考官方的文档或是网络上的资源。
进入Vim和创建文件
进入Vim很简单,如果安装完毕,那么直接在Linux的Terminal下面输入vim相关命令即可:
- #vim
- #vim file.txt
- #gvim
- #gvim file.txt
像其他Unix/Linux命令一样,Vim也有许多的选项,说实话,平时也不怎么用,所以请参考man或是参看帮助
- #man vim
- #vim --help
首先,Vim是一个全屏幕的字符编辑器,也就是说没有菜单。因为它出生于那个UNIX黑乎乎的字符终端时代,所以它没有菜单,没有鼠标支持的左键和右键,甚至键盘上连方向键,Home, End, PageUp, PageDown, Insert/Replace也都没有。所以Vim的所有编辑命令都是常见的字母,比如:a, e, c, d, y, p, u, x, r, ~等等。它只能通过(GUI除外)这些字母式的编辑命令来进行各种编辑,比如插入,替换,删除,移动,查找等。
其次,Vim的有二个工作模式:一个是编辑模式,也就是说像Notepad一样,在键盘上面打什么,编辑器里面就会出现什么;另外一个就是命令模式,也就是说这种情况下,某些按键会被当作编辑命令。因为它的编辑命令都是普通的字母,所以为了让这些字母成为编辑命令,就需要设定一个模式,让其只在命令模式下是编辑命令,而在编辑模式下只是普通的字符。从编辑模式可以按Esc键(美式键盘上面最左上角的那个,其他键盘我就不知道了)进入命令模式;而在命令模式时,只要使用了插入相关的命令后,会自动切换到编辑模式。
退出Vim编辑器和其他有关文件写入的命令
退出稍稍有些不同,没有那么显而易见。就需要用到Vim专属的命令了:
- :q和:qa --用法是先按Esc切换到命令模式,然后输入:(冒号)q(按回车),这样就可以退出当前编辑,回到Terminal中,其中a的含义是全部,也就是说:qa是退出所有文件
- :x和:xa -- 用法与上面类似。它也是退出一个或所有文件,它与q的区别在到,如果文件没有被修改,:x命令不会改变文件的“最后修改时间Last modified”属性。这对于使用make的编译系统是有意义的,因为如果文件如果没有更新,判断依据是“最后修改时间”是否较上次有改变,是不会重新编译文件的。如果你的项目只有几十个文件的话,重新编译与否可能看起来没什么区别,但对于大项目,比如操作系统而言,编译一次要几个小时,所以能不重新编译就不要浪费时间。而:x命令就能避免修改文件的属性,当文件没有变化时(包括,用u/U命令回退操作)。所以这个命令是我一直都使用的退出命令,谁让咱只写程序呢!。对于其他的情况,这二个命令都一样儿!
- ZZ命令--与:q一样儿。这个我只在初学的时候用了几次,后来再也没有用过,敲起来太麻烦了。
除了上面讲的退出命令外,还有一些其他的命令,比如,
- :w -- 把Buffer写入文件,也就是保存
- :e filename -- 打开,或创建filename,并去编辑它,如果是:e(也就是不带参数)则停留在当前页面。
- :e!, :q!, :w!--!(叹号)的作用是强行执行的意思,所以:e!就是恢复到上一次保存的状态;:q!是强行保存退出,即使你在编辑一个只读文件;:w!是强行写入,强行保存,即使你在编辑只读文件。
基本编辑命令
基本的命令包括,插入,删除,替换
插入命令:插入命令执行的后,会留在编辑模式
- a -- 在当前光标后面插入字符,如a[cursor]b, 此时如果用命令a, 然后插入c, 那么结果是abc
- A -- 在行尾插入
- i -- 在当前光标处插入字符,如a[cursor]b, 此时如果用命令i, 然后插入c, 那么结果是acb
- I--在行首插入
删除命令:删除命令执行后会停留在命令模式
- d--这个命令要与移动命令组合使用才行,比如:dw删除一个连串非空格字符,de删除到词尾,dd删除当前行等等。词的定义是一连串的字母或数字,不包括空格和标点。
- D -- 删除当前光标到行尾
- x --删除当前光标所在的字符
替换命令:
- r--替换当前字符,一次只能替换一个字符,替换完后仍在命令模式
- c--要与移动命令一起用,比如:cw改变一个单词,ce改变到下一个空格,cc改变当前行
- C--改变当前光标至行尾。c与C的改变意思是,把指定的字串删除,然后把光标停在所删除的第一个字符的位置,并处于编辑模式。也就是说它与d和D的区别在于,c和C会进入编辑模式
- s--替换当前字符,并处于编辑模式
- S--改变整个当行,并处于编辑模式
拷贝:
- y--要与移动命令一起使用
- yy--复制当前行
- Y--复制当前行
粘贴:
- p--粘贴已复制的字串到光标后面
- P--粘贴已复制的字串到光标前面
其他命令:
- o(小写字母o)--在当前行下面编辑新的一行
- O(大写字母O)--在当前行上面编辑新的一行
- .(逗点)--重复上一次的编辑命令
- ~(波浪)--数字键1左边的那个。改变大小写,一次一个字母。
- >>--增加缩进
- <<--减少缩进,这二个命令对于程序代码来讲是非常实用的
- xp--互换二个字符,光标所指的与其后面的字符,如ab会变成ba
- J--连接当前行与其下一行,也就是把当前行下面的一行添加到这一行的行尾。
撤消命令:
- u--撤消上一次命令操作
- U--撤消在一行上面的所有操作,要把光标放在编辑动作所发生的行才有效。这个不是很常用,记得很久很久没有用过了
移动命令
基本移动命令:
- h--将光标向左移动一个字符,相当于左方向键
- j--将光标向上移动一个字符,相当于上方向键
- k--将光标向下移动一个字符,相当于下方向键
- l--将光标向右移动一个字符,相当于右方向键
当前行内移动:
- w--向前移动光标至一连串非空格尾,光标会停在该词的最后一个字符 上面
- e--向前移动光标到词尾,光标会停在该词的最后一个字符上面
- b--向后移动一个字
- $--移动光标到行尾
- ^--移动光标到行首第一个非空字符
- 0(数字0)--移动光标到行首
高级移动命令:
- ^D(Ctrl+D)--向下滚动半屏
- ^U(Ctrl+U)--向上滚动半屏
- ^F(Ctrl+F)--向下滚动一屏
- ^B(Ctrl+B)--向上滚动一屏
- z.--把当前行滚动至屏幕正中间
- z---把当前行滚动到屏幕最下方
- z Enter--把当前行滚动至屏幕最上方
- ^L(Ctrl+L)--刷新屏幕
- H--移动光标到当前屏幕最上面的一行
- L--移动光标到当前屏幕最下面的一行
- G--移动光标到文章最后面的一行
- Enter --- 移动到下一行第一个字符
- 移动到下一行第一个字符
- 移动到上一行第一个字符
- :line_number--移动至第line_number行,这是程序员最常用的命令,如:6,则跳到源文件第6行
搜索式移动:
- /pattern--搜索pattern,并定位光标在下一个pattern的第一个字符上面
- n--重复/pattern的搜索,也即寻找下一个匹配
- N--以相反方向重复/pattern的搜索,也即寻找上一个匹配
- ?--向后面搜索
- /--向前面搜索
- fx--在当前行内搜索字符x,停光标在下一个x上面,这里的x代码任何字符
- Fx--在当前行内搜索前一个x,停光标在前一个x上面,x代码任何字符
- tx--在当前行内搜索x,光标停在x的前一个字符上面,x代码任何字符
- Tx--在当前行内搜索前一个x,停光标在前一个x的前一个字符上面,x代码任何字符
- ;(分号)--在相同方向重复上一个搜索命令
- ,(逗号)--在相反方向重复上一个搜索命令
- *(乘号,或叫星号)--搜索当前光标所在的词,相当于对当前词进行/搜索,比如,光标停在词google内的任何字符上,那么*命令就相当于/google
数字组合显神奇
Vim最最神奇,也是吸引人们的地方在于,它可以把数字与编辑命令一起使用,以达到最高效的编辑方式。对于绝大多数命令来讲,所加上的数字是重复的意思,比如
- 5i--就是插入5次
- 6j--就是向上连续移动6次,相当于你按了6次j
- 5e--向前移动5个单词
- 6b-向后移动6个单词
- 8dd--删除8行
- 8yy--拷贝8行
- 8G--跳到第8行,与:8作用一样
能组合数字是Vim最能体现效率和神奇的地方,这里需要平时使用的时候多多体会,其中奥妙无限,却不是一句二句能讲的清的。
至此,如果上面这些命令全部都能熟练应用,就已经算是一个Vim的中级用户了,对于大多数人来讲,这些命令已经足够。如果能熟练应用这些命令就可以达到双手不离开键盘的牛人式的编程方式^_^。如果坚持练习,几个星期内就可以这些命令搞熟练,然后就可以学习高级的操作,比如窗口控制,多Tab页控制,扩充 Script脚本等等。