我有一些匹配分隔符的文本(在这种情况下,花括号,文本恰好是LaTeX,这只是偶然的):
\nb{\vec{n},\vec{y}} \in \vec{z}
我想做的是全局用\nb{...}
替换(...)
,同时尊重分隔符的嵌套。即,结果应为
(\vec{n},\vec{y}) \in \vec{z}
而不是
(\vec{n},\vec{y}} \in \vec{z)
这是由:%s/\\nb{\(.*\)}/(\1)/g
产生的。标准正则表达式无法处理匹配的分隔符,所以我没想到这种方式可行。我可以使用一些特定于vi的技巧来做到这一点吗?
答案 0 :(得分:3)
如果您安装了surround.vim,那么以下内容应该可以解决问题
:set nowrapscan
:let @q="/\\m\\\\nb{/e+1\<cr>cs{)dF\\@q"
gg@q
如果你不这样做:
:set nowrapscan
let @q="/\\m\\\\nb{<cr>dt{yi{\"_ca{()\<esc>\"0P@q"
gg@q
概述
创建一个搜索\nb{
的递归宏,将光标放在{
内,将}{
替换为()
。
细节的荣耀
:set nowrapscan
这可以防止搜索循环回文件。:let @q="..."
将我们的宏存储在q
注册表/\m\nb{/e+1
搜索\nb{
并将光标定位在{
cs{)
环绕声版本只会更改周围的{
)
@q
再次运行宏"
因此必须逃避一些事情才能正常工作。gg@q
转到文件顶部并执行注册q
非环绕版本在这里有所不同
yi{
复制{
的"_ca{()<esc>
更改内部文字并包含{
,并替换为()
"0P
将我们刚刚复制的内容粘贴到()
答案 1 :(得分:2)
我会使用以下:global
命令。
:g/\\nb{/norm!/^M%r)[{r(dF\\
键入^M
为 Ctrl + V ,输入。