29

假设我通过使用视觉选择 + yank 将 3 个字符“foo”拖放到剪贴板中,即:'vllly'

然后我将光标移动到第 5 行的另一个字符(我们称之为字符 x)上,我想用我之前拉出的内容替换它,即 foo。

我可以使用 'p' 在 x 之后粘贴 foo,或使用 'P' 在 x 之前粘贴 foo,但我想用 foo替换x。

我可以使用 'vp' 将 x 替换为 foo,但这只能工作一次,因为它会在我的剪贴板中留下 x。换句话说,如果我移动到下一次出现的 x 并再次点击 vp,它不会用 foo 替换它。

当然,我可以使用 :s/x/foo/gc 进行搜索/替换,然后忽略所有我不想替换的 x 出现,但这有点乏味,尤其是当我需要要做的是替换 2 或 3 次出现的 x 非常接近我的光标但不在同一行(即:第 2、3 和 7 行)。

所以目前我正在使用:2,7s/x/foo/gc,但我想知道是否有办法将光标移动到 x 并点击 [在此处插入魔法按钮] 将其替换为 foo。然后我可以移动到下一个出现的 x 并再次按下 [magic button] 并发出一声巨响,它再次将 x 替换为 foo。

尽管使用这个类比让我很痛苦,但假设您正在记事本中输入,然后选择 3 个字符,按 Ctrl+c 将它们复制到剪贴板,然后突出显示 x,然后按 Ctrl+v 将其替换为富。然后突出显示另一个 x,然后再次按 Ctrl+v,依此类推。

我如何在 vim 中做到这一点?

4

5 回答 5

48

怎么样s<C-r>0,这可以重复.

  • s删除光标下的字符并使您进入插入模式。
  • <C-r>0插入寄存器 0,它保存被抽出的文本。

您也可以手动使用s和键入foo,这也可以重复使用.

于 2012-05-24T09:25:59.093 回答
7

Paste from the 0 register with v"0p.

于 2012-05-24T09:17:45.083 回答
2

将您的“foo”复制到另一个寄存器中,例如注册一个:

“啊

然后直观地选择要替换为“foo”的字符并按

“AP

于 2012-05-24T09:17:14.363 回答
0

This is less than ideal, but if you yank to named buffer a (eg yank with "ay), you can use x"aP. Use your favorite map to make it a single keystroke.

于 2012-05-24T09:18:08.100 回答
0

我经常需要这个,为此我写了一个插件:ReplaceWithRegister

这个插件提供了一个二合一gr命令,用寄存器的内容替换 {motion} 覆盖的文本、整行或当前选择;旧文本被删除到黑洞寄存器中,即它消失了。

于 2012-05-24T12:32:38.757 回答