Vim global命令和重复操作
Vim global命令允许我们在某个指定模式的所有匹配行上运行可执行的 Ex 命令,缩写形式为 :g
,其处理重复工作的效率极高。
一、Vim global命令介绍
Vim global命令形式为 :[range]g[lobal][!]/{pattern}/[cmd]
,用于指示Vim在 [range] 界定范围内对 (不) 匹配模式 {pattern} 的文本行执行 Ex 命令 [cmd]。
range
表示操作范围,Vim :global
命令的默认作用范围是整个文件 (用%表示)
!
表示反转 :global
命令的行为,将在没有匹配到指定模式的行上执行 [cmd]
pattern
指定 :global
命令要匹配的目标模式,若将该域留空,Vim会自动使用当前(最近一次)的查找模式
cmd
除 :global
命令之外的任何 Ex 命令,Vim缺省使用 :print
命令 (缩写 :p
)
二、Vim global命令使用技巧
2.1 删除所有包含模式的文本行
假设有以下一段html代码,每列表项均由主题的标题及其URL两部分数据构成,我们将利用一条 :global
命令分别取出这两组数据。
<ol>
<li>
<a href="/episodes/show-invisibles/" >
Show invisibles
</a>
</li>
<li>
<a href="/episodes/tabs-and-spaces/" >
Tabs and Spaces
</a>
</li>
<li>
<a href="/episodes/whitespace-preferences-and-filetypes/" >
Whitespace preferences and filetypes
</a>
</li>
</ol>
如果想保留 <a>
标签内的标题内容而把其他行删掉,该怎么做?
首先,使用vim的搜索命令 /v</?w+>
先匹配左尖括号 (<),再匹配可选的正斜杠 (/?),再匹配一个或多个单词型字符(w+),最后匹配分隔符 (>),从而匹配到所有html标签。v
表示使用正则表达式的 very magic 模式。
然后,在Vim命令行模式下使用global命令 :g//d
删除所有包含html标签的行。由于 :g//d
命令没有指定命令要匹配的目标模式,因此将默认使用上一次用到的搜索目标 /v</?w+>
。
最后,为了删除剩余行所有行首的多余空格,可以使用Vim替换命令 :%s/^ *//
。
上述的Vim教程视频如下图所示。
如果想只包含 URL 的文本行,该如何操作?
在vim命令行模式下使用Vim命令 :v/href/d
可实现只保存包含 URL的所有文本行。
如前面所介绍,:vglobal
或简写的 :v
命令用于执行与 :g
命令完全相反的操作,:v/href/d
表示在指定模式 href
的非匹配行上执行 d
操作。
同样地,为了删除行首的多余空格,可以用vim替换命令 :%s/^ *//
实现。对应vim视频教程如下图所示。
彩蛋:如果想删除vim当前打开文件中的所有空白行,可使用vim命令 :g/^s*$/d
实现。
PS: 文章首发于我的个人博客:Vim global命令和重复操作-Vim入门教程(31),主要内容参考自《Vim实用教程》第二版。