如何在Vim中交互式搜索/替换正则表达式中从前向后切换?

时间:2015-08-12 05:09:52

标签: vim

例如我有一些文字:

    'y'     to substitute this match
    'l'     to substitute this match and then quit ("last")
    'n'     to skip this match
    <Esc>   to quit substituting
    'a'     to substitute this and all remaining matches {not in Vi}
    'q'     to quit substituting {not in Vi}

:%s/substitute/sub/gc我可以交互式搜索/替换。如果我按下&#39; n&#39;它转到下一个匹配的模式,我该如何撤消&#39; n&#39;?或向后搜索?

在通常的搜索模式/search_word中,我们可以跳过&#39; n&#39;和&#39; N&#39;有没有类似的替代品 - :%s/substitute/sub/gc

3 个答案:

答案 0 :(得分:7)

如果你只需要简单的单词替换,那么Mathias Bergert的答案就可以解决问题,并且替换文本总是固定不变的。也许这对我们日常编辑的70%感到满意。如果您需要s/.../.../的力量来满足您的替代需求,那可能还不够。例如,替换部分中的多个单词替换,后向引用或函数表达式。

我能想到的是,先做一个:

:s/substitute/sub/c

注意,没有% rangeg标记。

然后你就是:

  • nN进行/向后搜索,
  • 如果您认为应该替换匹配项,请按&
  • 如果您犯了一些错误,请按u

关键是,&将重做最后一次替换。

通过这种方式,您可以进行更复杂的替换,这对简单的cw来说很难:

  • s/f../&, /在所有fxx字后添加逗号(foo,far,fur ......)
  • s/\v(foo)(\d+)/\=submatch(1).(submatch(2)+1)/ foo
  • 后的增量编号
  • 等......

答案 1 :(得分:6)

就个人而言,我更喜欢. command而不是替代c标志,这会增加更多的灵活性。

做这样的事情:

/substitute<cr>
cwsub<esc>

搜索“替换”,然后cw(更改单词)为“sub”(<esc>退出插入模式)

现在,您可以使用nN移动并使用点.命令将“替换”替换为“sub”。使用u,您甚至可以撤消最后一个。

答案 2 :(得分:0)

我刚刚为此制作了一个插件。它比其他答案更广泛,所以如果您对插件感到满意,您可能会喜欢它

https://github.com/sosmo/vim-easyreplace

基本上,当你按ctrl-n时,它会逐个执行你对每个匹配的替换。