FC55 决胜命令行

出自Full Circle 中文项目主页

跳转到: 导航, 搜索

作者:Lucas Westermann


上个月,我写过一篇简单介绍Gvim/Vim的文章,我希望在这篇中详细介绍一下。我最近收到一封来自读者的email问我是否值得学习Vim。 email中大致的要点是: a) 如果你工作的时候用的是Windows,学习Vim的是否有意义? b) 如果你不是经常编程(或者是根本不编程),Vim是否有用? 我回了一封很长的email,最后归结为以下两点: a) Gvim/Vim有Windwos版,所以你随时都可以使用。 b) 我发现Vim提供了很多功能让重复的任务变得非常容易完成。这一点在编程的时候尤为突出(比如:文件头部元信息/注释,函数调用,方法,格式化代码,重构等等), 但是如果你发现你需要对某些特定的文字做一些重复操作或者是要处理大批量的文本,Vim绝对会让你轻松很多。 因此,这个月的教程中将会涵盖宏,查找/替换,字符匹配,还有正则表达式的基本介绍。


开始之前,请牢记于心:使用Vim。


我的意思是简单地使用Vim处理一些日常的任务大概一个星期左右,一旦你发现你在重复某个操作的时候,就在网上查找一些如何将这个操作实现自动化的教程(或者,最基本的就是减少敲键盘的次数)。可能一开始的时候会慢一些,但是它将会随着熟练程度增加而不断减少所花费的时间。 我说在网上查找很简单的原因是,根据我的经验,相对别人教你,根据你的实际问题去寻找答案反而可以提高你解决问题的能力。


现在开始进入正题吧......

Vim提供了很多的功能,但并不是所有的功能你都需要用到,所以我推荐跳过那些你不需要或者是你不使用的篇章,这样可以减少你开始操作所需要的信息量。 接下来的所有的示例中,在"<>"里面的是你需要的变量名字,在“[]”里头的是在键盘上的物理按键。还有,除非有特殊说明,所有的命令和按键都是在Vim的缺省模式下(“空白”的那个)。


目录

宏:

Vim提供了创建on-the-fly宏。这意味着你可以在Vim中录制一组命令集然后就可以很容易地重复使用。基本的方法是:

[q]<letter><commands>[q]

[q]键开始录制宏,录制结果是存储到你所输入的letter中,一旦你按下[q]<letter>你就可以开始使用Vim提供的命令实现你所需要的操作。录制完成,再次按下“q”键(缺省模式下)。举个简单的例子:

   [q][b]
   <series of commands>
   [q]

这个宏将会绑定到“b”键。执行宏的命令格式是:“@<letter>”,比如在这个例子中是:@b Vim中的任意命令,你都可以在之前加上数字重复执行N次。比如输入“55@b”,宏“b”就会执行55次。输入“@@”则执行上一个宏命令。如果你想知道更多,我推荐阅读Vim Wiki上的文章:http://vim.wikia.com/wiki/Macros


查找:

在Vim(还有与Vim类似的比如:more,less,mutt等等),都可以使用下面格式进行查找:

/<term>

斜杠告诉程序接下来的查找项(在Vim中整个的包括斜杠在内的整个项都会显示在窗口的底部)。光标将会移动到查找单词第一次出现的位置。按[n]键查找下一个出现的位置,使用[shift]+[n](相当于[N])向上查找。


替换:

Vim支持正则表达式。这在替换字符的时候极其有用(在Vim中被称为“substitution”),因为你可以匹配最大数量的查找结果。首先,我们介绍普通查找和替换: :%s/<term>/<replacement>/ 这条命令会找到<term>第一次出现的位置,然后用<replacement>进行替换。如果你想做全局替换的话,使用下面的命令: :%s/<term>/<replacement>/g 所以如果你想所有的”vim“替换成“Vim”,命令如下: :%s/vim/Vim/g


正则表达式:

说到正则表达式,使用下面的命令就可以实现替换所有的“vim, VIM, vIm, viM” with “Vim”字符了:

   :%s/[vV][iI][mM]/Vim/g

大部分人应该能猜到,在“[]”中的字符是可能匹配(或者说是范围)的结果(以后称之为集合)。你可能会问你自己“为什么不把他们放在一个集合当中?”。如果你想这么做的话(你可以试一下),你将会发现它会把每一个字符都替换成“Vim”,而不是整体进行替换。这是因为方括号表示单词中的一个字符/位置。如果告诉它替代所有的字符,而不指明单词中的位置(这将会把方括号中的内容分割成多个集合),它将会简单地对每一个字符进行替换。

所以,如果你想匹配所有大写,小写,数字类型,你可以使用[A-Za-z0-9]。这样它就会把相邻的任意字符都当成一个新的匹配范围,在连字符"-"的两端的字符会组成一个范围。 所以这3个范围是:A-Z(大写字母),a-z(小写字母),0-9(数字)。如果你想匹配任意一个以“T”开头的单词,可以使用T[a-z]*。星号("*")会告诉Vim后面可以出现任意次数。因为我们并没有包含空格在这个集合当中,所以匹配将会在单词结束的地方停止。

正则表达式提供了很多的选择,你可以使用[1-9][0-9]\{3\}这个表达式查找在1000到9999之间的数字。这个例子中大括号是一个限制条件(i.e. 匹配项的重复次数)。你也可以使用范围来实现这个例子。比如,[1-9][0-9]\{2,3\} 查找100-9999之间的数字。你需要使用反斜杠对花括号进行转义,这样Vim就不会把它当成匹配模式了。

这也只是一些正则表达式的一个简单的介绍。当它变得更高级的时候就会更复杂。如果你要深入学习,我强烈推荐这篇教程:http://www.regular-expressions.info/tutorial.html。 还有其他很多的博客文章教你如何研究然后写出你需要的表达式。

我希望你会对这篇教程感兴趣。我计划下个月继续写相关的课题-Pendatacty1的概览(Firefox的类Vim接口)。如果你有疑问,意见,或者是建议的话可以直接给我发邮件,地址是:lswest34@gmail.com。如果你给我发email的话,主题麻烦写上“FCM”或者“C&C”(或者,像这条正则表达式: [fFcC][cC&][mMcC]).

个人工具