Vim搜索最后编辑的单词
在Vim中编辑代码时,我经常发现自己也在做同样的事情。我将移动到某个单词,然后按“cw”或“ciw”编辑该单词。然后我想转到我刚刚编辑的单词的下一个匹配项。“*”不起作用,因为它会将我移至下一个出现的新词(而不是旧词) 例如: 在下面的代码中,我的光标位于第一个出现的“foo”上,我想将其更改为bar。我按“cw”并写“bar”。然后我想转到下一个出现的'foo',这样我就可以按'.'来更改它。按“*”将移动到下一个“栏”,而不是“foo”。我知道的唯一解决方法是使用替换命令更改所有“foo”,这可能不是我想要的,或者按“*”移动到下一个“foo”,然后按“#”返回以存储“foo”作为搜索词,这样我就可以按“n”向前移动。是否仍然可以在不跳转到下一个单词的情况下设置搜索词(设置“n”不去任何地方的单词) -->Vim搜索最后编辑的单词,vim,Vim,在Vim中编辑代码时,我经常发现自己也在做同样的事情。我将移动到某个单词,然后按“cw”或“ciw”编辑该单词。然后我想转到我刚刚编辑的单词的下一个匹配项。“*”不起作用,因为它会将我移至下一个出现的新词(而不是旧词) 例如: 在下面的代码中,我的光标位于第一个出现的“foo”上,我想将其更改为bar。我按“cw”并写“bar”。然后我想转到下一个出现的'foo',这样我就可以按'.'来更改它。按“*”将移动到下一个“栏”,而不是“foo”。我知道的唯一解决方法是使用替换命令更改所有“foo”,
我会搜索
foo
,例如
/foo
然后,当我按下“n”键时,它会找到foo
-n
的下一个实例,并搜索它找到的下一个实例
然后,您可以执行
cw
并切换到bar
,然后按esc
,然后n
将带您进入下一个foo
,而不必先返回,然后再前进。由ciw
等命令替换的文本将放入默认寄存器“
”。刚刚输入的文本位于专用寄存器”
。因此,您可以使用以下命令搜索(前者):
/”
请注意,这只是快速99%的解决方案;要处理各种角色,您需要转义:
/\V\C<C-r>=escape(@@, '\')<CR><CR>
/\V\C=escape(@,\)
插件替代方案
因为我经常有与您在问题中描述的完全相同的用例(替换一个简短的文本,然后在下一个匹配中重新应用),所以我编写了;它提供了一个gc{motion}
映射,作为c
的替换,然后在行/缓冲区的其余部分重新应用更改(用于[count]
事件)。保持简单并使用undo
- 使用
撤消更改u
- 通过
*
- 通过
:h撤消
未匹配寄存器方法
这与@Ingo Karkat方法相同。我很快会在这里重复:
/<c-r>"<cr>
:s
命令还可以选择一个范围,以便您可以直观地选择行,并在这些行上进行替换。c
标志代表confirm
,它将使:s
在每次替换之前发出询问。请参阅:h:s
和:h:s_标志
使用
和gn
动作
- 通过
或/
搜索您的模式*
- 通过运动
上的gn
操作符更改图案文本。e、 g.c
cgnbaz
- 只要不断点击
重复即可
:h gn
和:h.
注意:
gn
运动从7.4版开始可用您知道搜索命令的c
标志,即:%s/foo/bar/gc
?对我来说,这似乎是解决你问题的好办法,但并不是真正回答你的问题。我想这可能会有所帮助:我阅读了它,因为他们没有首先搜索foo
,而且它应该在“小删除”注册表中-
/<C-r>"<CR>
/\V\C<C-r>=escape(@@, '\')<CR><CR>
/<c-r>"<cr>
:%s/foo/bar/gc