我的粘贴缓冲区中有一些文本,例如我做了一个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
从您的复制寄存器中粘贴,然后(这是可重复的)。"0p
cw
^R0
复制寄存器的另一面是小删除寄存器"-
。任何小的删除或更改删除都放在此处,但猛拉永远不会触及"-
。如果删除少于整行,则视为小删除。
寄存器"1
-"9
是大型删除历史记录寄存器。包含"1
最新的大删除或更改删除,以及"9
包含最旧的大删除或更改删除。只有不小的删除,即删除一整行或多行,才会被推送到"1
- "9
。
对于任何更改寄存器的操作,副本也始终放置在默认寄存器中,也称为未命名寄存器""
。这是当您没有显式命名寄存器时使用的寄存器。
寄存器"_
是黑洞寄存器,它永远是空的。如果删除它,任何寄存器中的任何内容都不会改变,甚至默认""
寄存器或黑洞寄存器本身也不会改变。除了您的撤消历史记录之外,删除的文本已完全消失。从黑洞寄存器中拉出或粘贴基本上没有任何作用。
黑洞寄存器"_
允许您执行一些操作,例如第一个小删除,然后将许多其他删除放入"_
而不更改您的小删除寄存器"-
,然后粘贴您的第一个小删除。
您可能已经熟悉普通的命名寄存器,它们只是寄存器"a
- "z
,您可以随意将它们用作暂存空间。如果您通过大写形式"A
-引用命名寄存器"Z
,您将附加到它而不是替换其内容。
其他寄存器是最后插入的寄存器".
、文件名寄存器"%
、"#
命令寄存器":
、搜索寄存器"/
和表达式寄存器"=
。
您可以使用命令获取所有这些寄存器及其内容的列表:register
。因为它显示了寄存器的当前内容,所以该命令对于试验和了解什么最终在哪里非常有用。
答案3
yw
拉出您的单词,然后将光标移动到要替换的单词并使用"_dw
它来删除它,将文本发送到空寄存器(这样它就不会覆盖寄存器的内容"
,默认情况下拉出/剪切的文本位于该寄存器中),然后只需粘贴p
.
您可以使用以下映射来使事情变得更容易一些:
nnoremap <leader>d "_d
...所以在正常模式下,您可以使用\dw
删除一个单词,而不影响"
寄存器。
答案4
我经常需要这个,我编写了一个插件来简化并允许最大速度:替换为寄存器。
该插件提供了一个二合一gr
命令,可以用寄存器的内容替换 {motion} / 文本对象、整行或当前选择覆盖的文本;旧文本被删除到黑洞寄存器中,即它消失了。它透明地处理许多极端情况,并允许通过标准.
命令快速重复。如果您不喜欢它,它的页面上有替代品的链接。