Vim中如何通过搜索删除命令删除含嵌套花括号的完整code代码块
Vim 批量删除带随机嵌套层级的
code 开头代码块 核心需求
批量清理文件中所有以 code 开头的花括号包裹代码块,这类块的通用结构为:
code { 任意业务内容 { 第一层嵌套块 } { 带更深层级的内容{ 嵌套最深层的语句 } } }
这类代码块没有固定格式约束,每个块内部的花括号嵌套数量完全随机,单文件中存在成千上万个同类块需要处理。
常规操作的局限性
多数人第一反应会编写删除命令 :g/code.*/.,/}/d,但这条命令存在明显缺陷:
- 命令的删除范围是从当前匹配到的
code开头行开始,一直向下扫描到 第一个出现的右花括号 位置 - 范围匹配不会计算括号的嵌套配对关系,碰到块内部嵌套的第一个右花括号就会提前截断,完全没法删除完整的目标代码块
可正确处理嵌套的批量删除命令
借助Vim原生的括号配对文本对象能力,执行以下全局命令即可完成全量清理:
:g/^code\s*{/normal! dat
命令实现逻辑
:g/^code\s*{全局遍历整个文件,定位所有满足“行首为code、后跟可选空白字符和左花括号”的位置,在每个匹配行的位置依次执行后续操作normal! dat是向Vim发送标准普通模式的按键指令:da触发“删除整个完整选中对象”的操作t指定选中对象为花括号包裹的文本块,Vim对这类括号文本对象的支持是自动计算任意层级的配对关系,不受内部嵌套数量的影响,能精准匹配到和当前code {配对的最外层右花括号位置
这套命令不需要手动统计嵌套括号层数,哪怕成千上万个块存在随机的嵌套层级,也能一次性删完所有完整的目标代码块。
小提示:如果存在
code关键字和左花括号分行书写的情况,可以把全局匹配规则调整为:g/^code\>/normal! dat,依然可以正确定位并删除完整的配对块。
内容的提问来源于stack exchange,提问作者Vigneshwaran V
相关产品推荐
相关产品推荐

