每日一Vim(28)全局命令

本文详述了 Vim 编辑器中全局命令的使用方式及其强大功能,通过具体实例展示了如何利用全局命令高效处理文本,如实现 tac 功能、使用 grep、排序 CSS 样式等,强调了全局命令在处理重复性工作中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

每日一Vim(28)全局命令

全局命令在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麻烦可大了。

转载请注明出处,谢谢合作!作者---zhijun

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值