在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';
}
答案 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
。
这与@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
,而无需返回前方。