如何在vi中找到替换确认时返回到上一个?

时间:2017-06-10 01:07:21

标签: vim vi

我在vi进行查找和替换时经常会这样做:

:%s/find/replace/gc

通过按n,您可以选择跳过,或按y进行替换。但是,有时当我打算按n时,按y时,我会不小心跳过一个大文件中的一个。

如何倒退到前一个并给我第二个更改?

基本上,如何findsearch)临时的另一个方向?感谢。

3 个答案:

答案 0 :(得分:4)

我不确定您是否要中断当前的查找替换操作并再次恢复。但如果这是可以接受的,这是我的建议:

  1. 按照您提到的方式开始寻找替换: :%s/find/replace/gc
  2. n意外跳过替换后,按<ctrl-C>
  3. 中断搜索
  4. <shift-N>返回上次出现的find期限
  5. 当您使用此词时,运行find-replace略有不同::.,$s/find/replace/gc
  6. 继续操作
  7. 所有这些功能都适用于vim本机功能,无需安装任何插件。

    注意:.,$范围说明符表示对以当前行开头的一系列行执行:ssubstitute)操作(由{表示) {1}})直到最后行(由.表示)。

    注意2:您可能已经知道了,但是对于偶然发现此帖子的其他人搜索类似的内容重申了这一点 - $范围说明符表示执行%:s)在当前活动缓冲区的所有行上操作。

答案 1 :(得分:2)

这不是问题的答案,而是一个非常好的选择。我最近发现了CtrlSF插件,它极大地改进了搜索/替换过程。

基本上,您将搜索结果放在缓冲区中,并且可以在此单个缓冲区中执行所有替换。

在您的方案中,您首先执行<p style="width: 20%; border: 1px solid black">ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd1</p> ,获取包含所有文件中所有匹配项的缓冲区,然后执行:CtrlSF find并使用/find移动目标并更改它们(当然,您实际上只能更改第一个,然后使用n重复替换。

如果您错过了某个目标,只需按.即可返回上一个结果并替换它。

答案 2 :(得分:0)

好像您不能使用此模式回到以前的比赛。出现的栏建议以下命令y/n/a/q/l/^E/^Y,但其中没有一个将返回到先前的匹配。

但是您可以使用下面介绍的不同模式

  • 键入此/pattern,用感兴趣的词替换模式
  • 您的光标导航到第一次出现,如果您不需要更改它,请按n,它将导航您到下一次出现;
  • 由于您了解需要替换一个单词,因此可以通过键入cw来执行此操作,此命令将剪切前向单词并将您转换为插入模式;
  • 在释放的地方键入所需的文本,然后按ESC切换回命令模式;
  • 现在再次按n直到出现所需的状态;
  • 由于您意识到需要更改事件,因此只需按.,它就会重复前面提到的操作;
  • 如果要返回,只需使用N