读书人

为啥这些死脑筋们在用 VI ?(转)

发布时间: 2012-07-02 17:46:22 作者: rapoo

为什么这些死脑筋们在用 VI ?(转)

原文:http://www.oschina.net/news/25882/why-they-are-using-vi

?

不管你们信不信,现在有很多人迷恋这个30多年历史的VI编辑器(最好的克隆和改进版本VIM也已经有15岁了).

他们不是守旧派,跟不上时代潮流——VI用户的社区正在不断增长着,我自己用VI已经2年了(在有了10年编程经验之后),我的很多朋友也都开始使用VI了,有趣的是,有很VI用户在VI出现前还没有出生。

当然,VI/VIM编辑模式比其它任何编辑嚣都出众肯定有原因的,你不必非得是Unix高手才能用它,相反,VIM可以免费在任何平台下使用,并且它也可以作为其它主流IDE的插件使用,现在让我来澄清几个误解,并用一些真实例子说明为什么它是极好的编辑器。

误解#1:模态编辑

你第一次被VI/VIM难住,可能是对必须先用”i”才能开始编辑感觉震惊和厌恶,记不住使用”hjkl”来移动光标方向,并且需要按”a”才能在光标后面追加内容.因为你可能已经习惯使用其它编辑嚣,并且方向键在插入模式管用(90%情况下是这样的,如果系统配置正确的话),你可能除特别需要,保持在插入模式而不会返回到正常模式. 你可能会花20分钟在插入模式下,并且会抱怨:”我到底可怎么记住现在正在插入模式下还是正常模式下?”

很显然,这是一个完全错误的使用VI/VIM的方式,正确方式是,你不会在意模式,你会一直在正常模式下,只有当需要插入或修改字符时才会进入插入模式,编辑完成之后马上按<Esc>返回到正常模式.因此,如何记住当前模式问题并不存在.当你在编辑文字的时候,不要在插入模式去接听电话,而应该退出插入模式,接听电话,或者返回的时候按<Esc>进入正常模式.不要把插入模式当成一种状态.

让我来解释下这其中的哲学.

VI/VIM中的命令是可以组合使用的,比如”d”代表删除,”e”代表”移到单词末尾”,而”de”的功能就是删除从当前光标位置至单词结尾间的字符(有点像Ctrl-Shift-Right, Left, Del 快捷键在其它编辑器中实现的功能)

这样的好处之一是,”.”命令可以重复上次执行完成的组合命令(不包括移动命令), 执行完”dw”后,”.”会重复执行”dw”命令, 你可以移动光标,然后再按”.”会快速地删除当前光标处的下一个单词,这样让人感到难以置信的强大.

现在我们来看下插入模式. 一些命令(比如i,a,s等)可以让你进入插入模式键入文本直到按<Esc>, 说到这些命令, 整条命令也包括你在”i”命令和<Esc>之间键入的所有字符.

比如”iHello<Esc>”, 会在当前光标处插入”Hello”字符,而现在”.”命令可以在当前光标处重复插入”Hello”, 现在你应该能够明白强大之处了吧, 但还有更强大的, “A”会将光标移到当前行末尾并进入编辑模式, 因此, 当按<Esc>结束输入后,你可以按”.”在任何位置的行末插入相同的字符.

另外一个更加强大的例子是: “ce”命令, 由”c”和”e”组合而成,”c”(修改)命令会删除指定范围内的文本并进入插入模式,与”d”(删除)命令一样,但唯一不同的是它会进入插入模式而不是停留在正常模式. 这样的好处是你在这条命令之后所键入的文本同样也会作为这条命令的一部分. 因此如果你输入”ceHello<Esc>”, 将会替换当前光标位置到行末的内容为”Hello”, 而”.”命令同样也会重复这个运作.

动作(光标移动命令)也可以更加复杂, 有很多各种进入插入模式的命令(“o”会在当前行下插入新一行,”O”会在上面插入新一行,”S”会删除到行末的内容,等等…所有这些命令都会进入插入模式), 因此你可以想象,使用”.”可以创建重复执行多么强大的编辑命令.

示例#1: 完美的点命令

让我们来一个示例. 比如你已经在你的头文件中声明了三个新函数, 然后你需要在模块里实现它们. 你复制下面文本内容到你的实现文件里:

为啥这些死脑筋们在用 VI ?(转)

编程差不多都这样开始,不是吗?

现在你必须删除这些分号,并且添加一个空的函数体. 在上图光标处,你可以输入”A”直接将光标移到行末并进入编辑模式:

为啥这些死脑筋们在用 VI ?(转)

按"A"之后,注意进入插入后光标的位置

现在你使用<backspace>键删除分号:

为啥这些死脑筋们在用 VI ?(转)

删除很简单

然后 键入<return>{<return>}<return>,添加函数体:

为啥这些死脑筋们在用 VI ?(转)

插入跟其它编辑嚣一样

最后,按下<Esc>返回到正常模式下:

为啥这些死脑筋们在用 VI ?(转)

现在我们返回到正常模式下

现在你得重复以上步骤修改另外两个函数。怎么做呢?很简, 首先按”j”移动下移一下光标,然后 点”.” 复制上一次执行的命令(”A”,删除分号,插入文本), ?如果你按”j.j.”, 两次,你会得到如下结果:

为啥这些死脑筋们在用 VI ?(转)

j.j. 命令之后

VI的命令架构是关键,<backspace>和正常的输入都将作为命令的一部分, 并且命令是完全可以重复执行的。回想一下,日常编辑工作中有多少是重复的操作?

误解#2: 这不仅仅是正则表达式

VI/VIM对正则表达式的支持很好,很多编辑器都支持查找、替换等操作可以使用正则表达式,但是只有VI(据我所知)可以更加高级地使用正则表达式,比如执行一次正则查找,然后替换”begin”第二次出现的行的包括”proc”的下一行,或者任何你能想到的复杂操作。

这不是贬低正则表达式,或者VI/VIM的正则表达式支持,VI的主要强大之处,当你习惯使用它之后依赖的强大之处 是它的基本编辑模式:

读书人网 >开源软件

热点推荐