Vim搜索最后编辑的单词

3
在使用Vim编辑代码时,我经常会遇到相同的操作。我会移动到一个单词并按下'cw'或'ciw'来编辑该单词。然后我想移动到我刚编辑过的单词的下一次出现。 "*"无法正常工作,因为它将把我移到新单词的下一次出现位置(而不是旧单词的下一次出现位置)。
例如:
在下面的代码中,我的光标位于“foo”的第一次出现位置,并且我想将其更改为“bar”。我按下'cw'并写入“bar”。然后,我想移动到“foo”的下一次出现位置,以便我可以按'.'来更改它。按'*'将使我移到下一个'bar'而不是'foo'。我知道的唯一解决方法是要么使用替换命令更改所有'foo'(这可能不是我想要的),要么按'*'移动到下一个'foo'然后'#'返回存储 'foo'作为搜索项,以便我可以按'n'向前移动。有没有办法设置搜索项而不跳转到下一个单词(即,设置'n'要前往的单词,而不去任何地方)?
function(){
    var foo = 'blah';
    foo = 'blah';
    foo = 'blah';
}

-->

function(){
    var bar = 'blah';
    foo = 'blah';
    foo = 'blah';
}

1
你知道搜索命令的 c 标志吗,即 :%s/foo/bar/gc 吗?对我来说,这似乎是解决你的问题的好方法,但并不完全回答你的问题。 - pfnuesel
我认为这可能会有所帮助:https://dev59.com/SW855IYBdhLWcg3wlVca - pfnuesel
3个回答

3

ciw这样的命令替换的文本会被放入默认寄存器""中。刚输入的文本在特殊寄存器"中。因此,您可以使用以下方式搜索前者:

/<C-r>"<CR>

请注意,这只是快速解决方案中的99%;为了处理所有类型的字符,您需要进行转义:

/\V\C<C-r>=escape(@@, '\')<CR><CR>

插件替代方案

由于我经常遇到与您在问题描述中相同的用例(替换短文本,然后重新应用下一个匹配),因此我编写了ChangeGlobally插件。它提供了gc{motion}映射作为c的替代品,然后在行/缓冲区的其余部分(对于[count]个出现)重新应用更改。


1
同时,它应该在“小删除”寄存器中以“-”的形式呈现。 - Ben

2

保持简单,使用撤销

  • 使用u来撤销你的更改
  • 通过*搜索
  • 通过<c-r>重做你的更改

Vim拥有一个很好的撤销系统,所以请确保你充分利用它。参见:h undo

未命名寄存器方法

这与@Ingo Karkat的方法相同。我在这里快速重复一下:

/<c-r>"<cr>

请参见:h quotequote:h c_ctrl-r

替换

:%s/foo/bar/gc
:s 命令还可以接受一个范围,因此您可以可视化选择行并对这些行执行替换。 c 标志代表 confirm,这将使 :s 在每次替换之前询问。请参阅 :h :s:h :s_flags

使用 .gn 动作

  • 通过 /* 搜索您的模式。
  • 使用运算符 c 并在动作 gn 上更改模式文本。例如: cgnbaz<esc>
  • 只需不断按下 . 以重复操作。

有关更多信息,请参见 :h gn:h .

注意:从版本 7.4 开始,gn 动作可用。


1

我会搜索foo,例如。

/foo

当我按下“n”键时,它会找到下一个foo的实例 - n会搜索它所找到的实例的下一个实例。
然后您可以执行cw并更改为bar,然后按esc,然后再按n,将带您到下一个foo,而无需向前和向后移动。

1
我理解为他们一开始没有搜索 foo - doctorlove

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接