Vim 如何替换vi中的匹配分隔符?
我有一些文本具有匹配的分隔符(在本例中,是大括号,文本恰好是LaTeX,这只是偶然的): 我想做的是用Vim 如何替换vi中的匹配分隔符?,vim,vi,replace,delimiter,Vim,Vi,Replace,Delimiter,我有一些文本具有匹配的分隔符(在本例中,是大括号,文本恰好是LaTeX,这只是偶然的): 我想做的是用(…)全局替换\nb{…},同时考虑分隔符的嵌套。也就是说,结果应该是 (\vec{n},\vec{y}) \in \vec{z} 而不是 (\vec{n},\vec{y}} \in \vec{z) 这是由:%s/\\nb{\(.*\)}/(\1)/g产生的。标准正则表达式无法处理匹配的分隔符,所以我不希望这种方法起作用。是否有一些特定于vi的技巧可以用来实现这一点?如果您已经安装了,那么下
(…)
全局替换\nb{…}
,同时考虑分隔符的嵌套。也就是说,结果应该是
(\vec{n},\vec{y}) \in \vec{z}
而不是
(\vec{n},\vec{y}} \in \vec{z)
这是由:%s/\\nb{\(.*\)}/(\1)/g产生的。标准正则表达式无法处理匹配的分隔符,所以我不希望这种方法起作用。是否有一些特定于vi的技巧可以用来实现这一点?如果您已经安装了,那么下面的技巧应该可以实现
:set nowrapscan
:let @q="/\\m\\\\nb{/e+1\<cr>cs{)dF\\@q"
gg@q
:立即设置RAPScan
:let@q=“/\\m\\\\nb{/e+1\cs{)dF\\@q”
gg@q
如果您没有:
:set nowrapscan
let @q="/\\m\\\\nb{<cr>dt{yi{\"_ca{()\<esc>\"0P@q"
gg@q
:立即设置RAPScan
let@q=“/\\m\\\\nb{dt{yi{\”\u ca{()\”0P@q"
gg@q
概述
创建一个递归宏,搜索\nb{
,将光标定位在{
内,将{
替换为()
细节的荣耀
:立即设置RAPScan
这可防止搜索在文件周围循环
:让@q=“…”
将宏存储在q
寄存器中
/\m\nb{/e+1
搜索\nb{
并将光标定位在{
cs{)
环绕版本只需使用更改周围的{
)
@q
再次运行宏
- 使用了
“
所以必须逃避一些事情,这样它们才能正常工作
gg@q
转到文件顶部并在寄存器q
非环绕声版本在这里稍有不同
yi{
复制{
中的文本
“\u ca{()
更改内部文本,包括{
,并替换为()
“0P
将刚才复制的内容粘贴到()
我将使用以下
:global
命令
:g/\\nb{/norm!/^M%r)[{r(dF\\
键入^M
作为Ctrl+V,输入。非常好的帖子。我还没有测试过它,但是使用surround.vim的方法与我立即想到的是一样的+1@Peter,@sehe:使用:global
命令重复更改,有时会使整个事情变得不那么冗长。@ib:当然会,但我不知道latex,也不知道re将有多个\nb{
'每行。@Peter:同意。无论如何,如果第行有多个\nb
,我宁愿重复一个较短的全局命令。:-@ib:虽然我对递归宏有特殊的理解,但我必须同意你的意见,多个:g/
可能会更好。:)这会删除\nb前一行中的每个字
,这是不正确的。看起来dB
应该是d2b
或dF\\
。@uckelman:你说得对,我在最后一刻犯了一个错误。最初(从修订历史中可以看到),该delete命令是d3h
,但我决定最好不要使删除依赖于命令的长度(在:g
模式中很容易更改),我选择了简单的dB
,它在\nb
+1之前有一个文本阻塞时删除了太多内容,用于使用:g/
和[{
。环绕版本有点像这样:g/\\nb{/norm/^Mdt{cs{
。注意::norm
上没有!
:g/\\nb{/norm!/^M%r)[{r(dF\\