分类: LINUX
2015-09-15 11:05:50
全局命令在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麻烦可大了。