Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185577
  • 博文数量: 60
  • 博客积分: 1597
  • 博客等级: 上尉
  • 技术积分: 461
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-20 13:24
文章分类

全部博文(60)

文章存档

2017年(15)

2016年(6)

2015年(37)

2008年(2)

分类: LINUX

2015-09-15 11:05:50

全局命令在Vim中有这举足轻重的作用,特别对于那些重复性的工作尤为有效,它能对匹配的所有行执行某个命令,先来看看它的语法:

:[range]global[!]/{pattern}/{command}

[range]指定作用范围,默认global命令作用于整个文件,不像:normal等命令,normal默认是作用于当前行。

{pattern}:对于range范围内的文本,如果匹配pattern,就会执行command,[!]:相当于取反(也可以用vglobal),也就是不匹配patten的行。

command默认是print,打印文本行。

举例:

  1. 实现Linux命令tac的功能(与cat对应的一个命令,反向输入文本行)
    :g/^/m 0 这里的^表示所有行(包括空行),.表示非空行,m 0表示将当前行移至第0行。这样就实现了tac的功能。

  2. grep:使用Linux的朋友对grep再熟悉不过了,它其实就是:g/re/p的缩写,re表示regular express,p表示print

  3. vred:删除不匹配re的行,v就是vglobal的缩写,比如删除所有不包含href的行::v/href/d

  4. 排序:对于下面的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麻烦可大了。

阅读(1202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~