全局命令在Vim中有这举足轻重的作用,特别对于那些重复性的工作尤为有效,它能对匹配的所有行执行某个命令,先来看看它的语法:
:[range]global[!]/{pattern}/{command}
[range]指定作用范围,默认global命令作用于整个文件,不像:normal等命令,normal默认是作用于当前行。
{pattern}:对于range范围内的文本,如果匹配pattern,就会执行command,[!]:相当于取反(也可以用vglobal),也就是不匹配patten的行。
command默认是print,打印文本行。
####举例:
-
实现Linux命令
tac的功能(与cat对应的一个命令,反向输入文本行)
:g/^/m 0这里的^表示所有行(包括空行),.表示非空行,m 0表示将当前行移至第0行。这样就实现了tac的功能。 -
grep:使用Linux的朋友对grep再熟悉不过了,它其实就是:g/re/p的缩写,re表示regular express,p表示print -
vred:删除不匹配re的行,v就是vglobal的缩写,比如删除所有不包含href的行::v/href/d -
排序:对于下面的css片段:
div{ border:0; margin:0; padding:0; font-size:12px; font:inherit; vertical-align:baseline; }
我们想把{}中的样式按照字母的顺序排列成如下:
div{
border:0;
font-size:12px;
font:inherit;
margin:0;
padding:0;
vertical-align:baseline;
}
我们可以使用命令::g/{/ .+1,/}/-1 sort,这个命令看起来很复杂,好像也不符合global的语法。其实对于global语法,可以扩展成::g/{pattern}/[range][cmd],就是说cmd前面还可以指定range.因此我们可以把上面的命令来做一次剖析:
.+1,/}/-1 sort 这个命令就相当于[range][cmd],这里的range范围为:当前行(.)的下一行(+1)直到(,)匹配(})的前一行(-1)。如此一来这条完整的命令就好解释了,表示{的下一行一直到}的上一行执行sort命令。
费了这么大心思就为了这么一小块代码排个序,看似有点不值,完全可以把大括号里面的内容选中后执行sort就得了嘛,干嘛这么费劲啊,你可别忘了,global的厉害,它可以作用于这个文件,如果css文件有上百行,甚至千行,如果使用V模式执行sort麻烦可大了。
转载请注明出处,谢谢合作!作者---zhijun