【问题标题】:Vim search for last edited wordVim 搜索最后编辑的单词
【发布时间】:2014-01-30 13:26:46
【问题描述】:

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

【问题讨论】:

  • 你知道搜索命令的c标志,即:%s/foo/bar/gc吗?在我看来,这是解决您问题的好方法,但并不能真正回答您的问题。
  • 我认为这可能会有所帮助:stackoverflow.com/questions/4256697/…

标签: vim


【解决方案1】:

被ciw 等命令替换的文本被放入默认寄存器""。刚刚输入的文本在专用寄存器". 中。因此,您可以使用以下方法搜索(对于前者):

/<C-r>"<CR>

请注意,这只是快速 99% 的解决方案;要处理各种字符,您需要转义:

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

插件替代

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

【讨论】:

  • 也应该在“小删除”寄存器-
【解决方案2】:

保持简单并使用 undo

  • 使用u 撤消您的更改
  • 通过*搜索
  • 通过&lt;c-r&gt;重做您的更改

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&lt;esc&gt;
  • 只需继续点击. 即可重复。

请参阅:h gn 和:h . 了解更多信息。

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

【讨论】:

    【解决方案3】:

    我会搜索foo,例如

    /foo
    

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

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

    【讨论】:

    • 我读了它,因为他们一开始没有搜索过foo
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2012-01-04
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多