如何使用当前的粘贴缓冲区在 Vim 中执行“更改单词”?

Mic*_*ant 134 vim vi buffer replace

我的粘贴缓冲区中有一些文本,例如我做了一个yw(猛拉单词),现在我的缓冲区中有 'foo'。

我现在转到“bar”这个词,我想用我的粘贴缓冲区替换它。

要手动替换文本,我可以这样做cw,然后输入新单词。

如何进行“更改单词”,但使用粘贴缓冲区的内容而不是手动输入替换单词?

我现在最好的选择是到要替换的单词的开头并执行dw(删除单词),然后转到另一个位置,然后执行yw(猛拉单词)。然后回到替换区域并做p(粘贴)这有点笨拙,特别是如果它们不在同一个屏幕上。

jma*_*hew 182

选项1

您可以使用寄存器来执行此操作并为该过程进行键绑定。

猛拉要替换的单词yw

猛拉的字在0寄存器中,您可以通过发出:registers.

转到要替换的单词并执行cw。执行Ctrl+r然后0粘贴0寄存器。

对应的地图看起来像这样(假设Ctrl+j作为我们的关键组合):

:map <C-j> cw<C-r>0<ESC>

选项 2(更简单)

随着您的单词被猛拉,将光标移到您要替换的单词上并执行viwp。这是视觉选择内部单词并粘贴。

感谢评论中的@tlo:你也可以只做vep. 短一个字符。缺点是必须将光标定位在单词的开头,并且(与我的一样)更改缓冲区。

评论(来自迈克尔):

这很好。额外注意:第二种方法确实更简单,但仅适用于一次替换,因为在每次替换后,缓冲区都会更改为被替换的字段(旧文本)。第一种方法使用起来有点困难,但其优点是缓冲区 0 保持“原样”,因此您可以使用该方法对同一文本进行 1 次以上的替换。

  • 选项 3(更简单):在你的单词被 yanked 的情况下,将光标移到你想要替换的单词的第一个字符上并执行 `vep`。 (25认同)
  • `ve"0p` 可以让你重复你的改变 (4认同)

00p*_*eus 31

Vim 的方式是学习如何有意识地使用 yank、delete 等寄存器。一旦你知道了这些,你将很容易找到你自己的关键序列来做到这一点。

寄存器"0是 yank 寄存器。您猛拉的任何内容都将放在这里,但删除或更改删除都不会触及 register "0

所以,在你的例子中,你刚刚猛拉了一个词。要用你刚刚猛拉的东西替换一个词,你可以利用从不触及猛拉寄存器的删除。所以移动到目标词,用 删除它dw,然后从你的 yank 寄存器中粘贴"0p或者更好,cw然后^R0(这是可重复的)。

yank 寄存器的另一面是小的删除寄存器"-。任何小的删除或更改删除都放在这里,但 yanks 从不碰"-。如果删除少于整行,则删除算作很小。

寄存器"1-"9是大型删除历史寄存器。与"1包含最新的大删除或更改删除,以及"9包含最旧的大删除或更改删除。只有不小的删除,即一​​整行或更多行的删除,才会被推到"1- 上"9

对于更改寄存器的任何操作,副本也始终放置在默认值中,也称为未命名寄存器""。这是未明确命名寄存器时使用的寄存器。

register"_是黑洞寄存器,它永远是空的。如果你删除它,任何寄存器都不会发生任何变化,甚至默认""寄存器或黑洞寄存器本身也不会发生变化。除了您的撤消历史记录外,已删除的文本已完全消失。从黑洞寄存器中拉取或粘贴基本上没有任何作用。

黑洞寄存器"_可以让你先做一个小删除,然后在"_不改变你的小删除寄存器的情况下进行一些其他的删除"-,然后粘贴你的第一个小删除。

您可能已经熟悉普通命名寄存器,它们只是寄存器"a- "z,您可以随意将它们用作临时空间。如果您通过大写形式"A-引用命名寄存器"Z,您将附加到它而不是替换它的内容。

其他寄存器是最后插入的寄存器".、文件名寄存器"%"#命令寄存器":、搜索寄存器"/和表达式寄存器"=

您可以使用命令获取所有这些寄存器及其内容的列表:register。因为它显示寄存器的当前内容,所以该命令对于试验和了解最终结果非常有用。


evi*_*oup 13

yw to yank your word, then move the cursor to the word you wish to replace and use "_dw to delete it, sending the text to the null register (so it doesn't overwrite the contents of the " register, where yanked/cut text goes by default), and then simply paste with p.

You could use the following mapping to make things a little easier:

nnoremap <leader>d "_d
Run Code Online (Sandbox Code Playgroud)

...所以在正常模式下,您可以使用\dw删除一个单词,而不会影响"寄存器。


Ing*_*kat 6

我经常需要这个,我写了一个插件来简化并允许最大速度:ReplaceWithRegister

这个插件提供了一个gr二合一的命令,用寄存器的内容替换 {motion} / 文本对象、整行或当前选择覆盖的文本;旧文本被删除到黑洞寄存器中,即它消失了。它透明地处理许多极端情况,并允许通过标准.命令快速重复。如果你不喜欢它,它的页面有替代品的链接。


小智 6

按 进入视觉模式v捕捉有趣的文本,然后按 复制它y。现在捕获要删除的文本,然后按p进行粘贴。

在 Vim 中替换文本