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

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

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

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

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

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

我现在最好的选择是转到我想要替换的单词的开头并执行dw(删除单词),转到其他位置,然后执行yw(拉出单词)。然后返回到替换区域并执行p(粘贴)操作,这有点笨拙,尤其是当它们不在同一屏幕上时。

答案1

选项1

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

拉出您想要替换的单词yw

被拉出的单词位于0寄存器中,您可以通过发出 来查看:registers

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

其映射看起来像这样(假设Ctrl+j作为我们的关键组合):

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

选项2(更简单)

拉出单词后,将光标放在要替换的单词上并执行viwp。这是视觉选择内部单词并粘贴。

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

评论(来自迈克尔):

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

答案2

Vim 之道是学习如何故意地使用 yank、delete 和其他寄存器。一旦了解了这些,您就可以轻松找到自己的按键序列来执行此操作。

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

因此,在您的示例中,您刚刚拉出了一个单词。要将某个单词替换为您刚刚拉出的内容,您可以利用从不触及拉出寄存器的删除操作。移动到目标单词,使用 删除它,然后使用或更好的方法dw从您的复制寄存器中粘贴,然后(这是可重复的)。"0pcw^R0

复制寄存器的另一面是小删除寄存器"-。任何小的删除或更改删除都放在此处,但猛拉永远不会触及"-。如果删除少于整行,则视为小删除。

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

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

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

黑洞寄存器"_允许您执行一些操作,例如第一个小删除,然后将许多其他删除放入"_而不更改您的小删除寄存器"-,然后粘贴您的第一个小删除。

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

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

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

答案3

yw拉出您的单词,然后将光标移动到要替换的单词并使用"_dw它来删除它,将文本发送到空寄存器(这样它就不会覆盖寄存器的内容",默认情况下拉出/剪切的文本位于该寄存器中),然后只需粘贴p.

您可以使用以下映射来使事情变得更容易一些:

nnoremap <leader>d "_d

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

答案4

我经常需要这个,我编写了一个插件来简化并允许最大速度:替换为寄存器

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

相关内容