如何在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{...}:
- 光标移到
\foo的反斜杠\上 - 按
f{跳到左大括号{ - 按
%,光标会精准跳到对应的右大括号}(不管嵌套多少层都能找到) - 按
x删掉这个右括号 - 再按
%跳回左括号,然后按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
相关产品推荐
相关产品推荐

