我有一些匹配分隔符的文本(在本例中是花括号,并且文本恰好是 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 的技巧来做到这一点吗?
最佳答案
如果您安装了 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
将我们刚刚复制的内容粘贴到()
中
关于vim - 如何替换 vi 中的匹配分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7437206/