Vim 如何替换vi中的匹配分隔符?

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的技巧可以用来实现这一点?如果您已经安装了,那么下

我有一些文本具有匹配的分隔符(在本例中,是大括号,文本恰好是LaTeX,这只是偶然的):

我想做的是用
(…)
全局替换
\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\\