内容提要
全局命令是Vim中强大的多行操作工具,语法为`:g/pattern/command`,可对匹配行执行删除、替换等命令。支持反向匹配(`:v`)、范围限定、普通模式命令(`:normal`)、宏执行及递归使用。通过改变定界符、默认打印命令,可实现反转缓冲区、汇总待办、黑洞删除、合并空行和高级排序等功能。掌握它需熟悉命令行命令和正则表达式,能高效批量处理文本。
延伸解读
全局命令与grep的渊源
全局命令的默认行为是打印匹配行,其语法:g/re/p恰好拼成“grep”,源自ed编辑器。理解这一点有助于记忆:全局命令本质上是“对匹配行执行命令”,而打印只是默认动作。掌握这个底层逻辑,就能灵活替换为删除、替换、移动等操作,实现批量处理。
组合普通模式命令与宏
全局命令可与:normal结合,对匹配行执行普通模式操作,如行尾追加分号。也可通过宏录制复杂操作,再用:g/pattern/normal @a批量执行。这要求你熟悉普通模式命令和宏录制,但能极大提升重复性文本处理的效率。
递归与反向匹配的妙用
全局命令支持嵌套和反向匹配,如:g/console/v/two/d可删除含“console”但不含“two”的行。这种组合能精确筛选目标,但需注意模式串的优先级和逻辑,避免误删。建议先在小范围测试,再应用到整个文件。
实用技巧:反转、汇总与排序
文章展示了多个实用场景:用:g/^/m 0反转缓冲区,用:g/TODO/t $汇总待办,用:g/^$/,/./-1j合并空行,以及用范围排序数组。这些技巧直接解决常见编辑需求,但需理解范围参数和命令组合,建议结合示例逐步练习。
Q&A
Vim全局命令的基本语法是什么?
Vim全局命令的基本语法是 :g/pattern/command,其中pattern是匹配模式,command是要在匹配行上执行的命令行命令。
如何在Vim中删除所有不包含特定模式的行?
可以使用 :v/pattern/d 或 :g!/pattern/d 来删除所有不匹配pattern的行。
Vim全局命令如何与普通模式命令结合使用?
可以通过 :g/pattern/normal {command} 的形式,对匹配的行执行普通模式命令。例如 :g/./normal A; 会在每个非空行末尾添加分号。
如何使用Vim全局命令执行宏?
先录制宏到寄存器,例如 qa0A;<esc>q,然后运行 :g/pattern/normal @a 对匹配的行执行该宏。
如何反转整个缓冲区或指定范围的行?
反转整个缓冲区使用 :g/^/m 0;反转指定范围(如第5到10行)使用 :5,10g/^/m 0。
如何将所有TODO项复制或移动到文件末尾?
复制所有TODO到末尾::g/TODO/t $;移动所有TODO到末尾::g/TODO/m $。
如何将多个连续空行合并为一个空行?
使用命令 :g/^$/,/./-1j 可以将多个连续空行合并为一个空行。
如何对数组中的元素进行排序?
使用命令 :g/\[\/+1,/\]/-1sort 可以对方括号内的元素进行排序。