You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vim中删除指定括号对且保留嵌套括号结构?

在Vim中处理TeX文档的嵌套括号对移除问题

问题背景

我正在用Vim编辑大型TeX文档,需要移除\foo{}、\bar{}这类带嵌套括号的命令对。比如原文本:

\foo{ \bar{ \john{ TEXT } more text } my text}

期望效果:

  • 移除\bar{}后:
    \foo{ \john{ TEXT } more text my text}
    
  • 移除\foo{}后:
    \bar{ \john{ TEXT } more text } my text
    

之前试过正则%s/\\foo{\([^{}]*\)}/\1/gc,但搞不定嵌套结构,想利用Vim的括号匹配功能解决。


解决方案:用Vim原生括号匹配搞定嵌套问题

Vim的%命令本来就是用来匹配成对括号的,刚好能解决嵌套层级的定位问题,下面分两种场景说操作方法:

1. 手动处理单个实例(快速高效)

如果只是改几个地方,直接用原生按键就行:
比如要删\foo{...}:

  1. 光标移到\foo的反斜杠\上
  2. 按f{跳到左大括号{
  3. 按%,光标会精准跳到对应的右大括号}(不管嵌套多少层都能找到)
  4. 按x删掉这个右括号
  5. 再按%跳回左括号,然后按d{删掉\foo{这部分
    一套组合键就是:f{ % x % d{,几秒钟就能搞定一个。

2. 批量处理所有匹配项(自动化操作)

要批量删所有\foo{}或\bar{},可以写个简单的Vim函数把手动步骤自动化:
先在Vim里输入这个函数(可以存到~/.vimrc里复用):

function! RemoveCmd(cmd)
  " 精确匹配命令,避免误触相似命令
  let cmd_str = '\V' . a:cmd . '{'
  " 全局匹配所有目标,执行手动操作的按键序列
  execute 'g/' . cmd_str . '/norm! f{ % x % d{'
endfunction

然后调用函数处理指定命令:

:call RemoveCmd('foo')  " 移除所有\foo{...}的命令和外层括号
:call RemoveCmd('bar')  " 移除所有\bar{...}的命令和外层括号

这个函数的逻辑就是把手动操作的步骤重复执行在每个匹配位置上,完全利用Vim的括号匹配来定位边界,根本不用管嵌套多少层。

注意事项

  • Vim默认已经配置了{:}的括号匹配,不用额外改设置
  • 批量处理前建议先备份文档,或者先找几个实例测试一下函数效果
  • 如果文档里有全角括号这类特殊符号,需要调整matchpairs变量,但英文TeX文档一般不用管

内容的提问来源于stack exchange,提问作者Jpk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:48:09