Vim搜索最后编辑的单词

Vim搜索最后编辑的单词,vim,Vim,在Vim中编辑代码时,我经常发现自己也在做同样的事情。我将移动到某个单词,然后按“cw”或“ciw”编辑该单词。然后我想转到我刚刚编辑的单词的下一个匹配项。“*”不起作用,因为它会将我移至下一个出现的新词(而不是旧词) 例如: 在下面的代码中,我的光标位于第一个出现的“foo”上,我想将其更改为bar。我按“cw”并写“bar”。然后我想转到下一个出现的'foo',这样我就可以按'.'来更改它。按“*”将移动到下一个“栏”,而不是“foo”。我知道的唯一解决方法是使用替换命令更改所有“foo”,

在Vim中编辑代码时,我经常发现自己也在做同样的事情。我将移动到某个单词,然后按“cw”或“ciw”编辑该单词。然后我想转到我刚刚编辑的单词的下一个匹配项。“*”不起作用,因为它会将我移至下一个出现的新词(而不是旧词)

例如:

在下面的代码中,我的光标位于第一个出现的“foo”上,我想将其更改为bar。我按“cw”并写“bar”。然后我想转到下一个出现的'foo',这样我就可以按'.'来更改它。按“*”将移动到下一个“栏”,而不是“foo”。我知道的唯一解决方法是使用替换命令更改所有“foo”,这可能不是我想要的,或者按“*”移动到下一个“foo”,然后按“#”返回以存储“foo”作为搜索词,这样我就可以按“n”向前移动。是否仍然可以在不跳转到下一个单词的情况下设置搜索词(设置“n”不去任何地方的单词)

-->


我会搜索
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
    撤消更改
  • 通过
    *
  • 通过
Vim有一个很好的撤销系统,所以请确保您充分利用它。请参见
:h撤消

未匹配寄存器方法 这与@Ingo Karkat方法相同。我很快会在这里重复:

/<c-r>"<cr>
:s
命令还可以选择一个范围,以便您可以直观地选择行,并在这些行上进行替换。
c
标志代表
confirm
,它将使
:s
在每次替换之前发出询问。请参阅
:h:s
:h:s_标志

使用
gn
动作
  • 通过
    /
    *
    搜索您的模式
  • 通过运动
    gn
    上的
    c
    操作符更改图案文本。e、 g.
    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