Vim搜索最后编辑的单词

时间:2014-01-30 13:26:46

标签: vim

在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';
}

3 个答案:

答案 0 :(得分:3)

ciw之类的命令替换的文本将被放入默认寄存器""。刚输入的文本位于特殊寄存器".中。因此,您可以搜索(前者):

/<C-r>"<CR>

请注意,这只是快速的99%解决方案;要处理各种各样的角色,你需要逃脱:

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

插件替代

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

答案 1 :(得分:2)

保持简单并使用撤消

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

Vim有一个很好的撤销系统,所以一定要利用它。请参阅:h undo

Unamed register approach

这与@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动作

答案 2 :(得分:1)

我会搜索foo,例如

/foo

然后当我按下'n'时,它会找到foo的下一个实例 - n搜索它找到的下一个实例。

然后,您可以执行cw并更改为bar,然后按esc,然后n将转到下一个foo,而无需返回前方。