我的粘贴缓冲区中有一些文本,例如我做了一个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。缩短一个字符。下方必须将光标置于单词的开头,然后(与我的一样)更改缓冲区。

评论(来自Michael):

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

评论


选项3(甚至更简单):选中单词后,将光标放在要替换的单词的第一个字符上并进行vep。

– tlo
2014年9月9日在22:10



仅需更改一个单词时,我喜欢选项3。如果要更改的单词不只一个,则选项1允许我使用。操作员重复一遍。

–本征场
18-09-20在17:36



ve“ 0p会让您重复更改

– JKillian
19年2月6日在19:03

如果要将其映射到某些对象,则最好使用:map ciw 0 ,这样无论您按^ j字词的哪个位置都无关紧要。

– Paul Parker
19 Mar 3 '19 at 0:47

任何想知道CTRL-R为何如此神奇的人::help insert然后搜索CTRL-R / CTRL-R。关于ve“ 0p的工作原理,请参见:help寄存器

– Paul Parker
19 Mar 3 '19 at 0:50

#2 楼

Vim的方法是学习如何有意使用拉,删除和其他寄存器。一旦知道了这些,就可以轻松找到自己的按键序列。
寄存器"0是yank寄存器。您拖拉的所有内容都将放在此处,但删除或更改删除均不会触及寄存器"0
因此,在您的示例中,您只是拉了一个单词。要将单词替换为刚发送的单词,您可以利用从未碰到发送寄存器的删除功能。因此,移至目标词,用dw删除它,然后用"0p或更好的方法从yank寄存器中粘贴,cw然后^R0(可重复)。
yank寄存器的反面是小的删除寄存器"- 。任何小的删除或更改删除都放在此处,但是猛拉绝对不要触摸"-。如果删除少于一个完整行,则删除计数也很小。
寄存器"1-"9是较大的删除历史记录寄存器。其中"1包含最新的大删除或更改删除,而"9包含最旧的大删除或更改删除。仅删除不小的删除,即删除一个完整行或更多行,才被推送到"1-"9。对于任何更改寄存器的操作,副本也始终放置在默认的无名寄存器""中。 。这是未明确命名寄存器时使用的寄存器。
寄存器"_是黑洞寄存器,并且始终为空。如果将其删除,则所有寄存器中的任何内容都不会更改,甚至不会更改默认的""寄存器或黑洞寄存器本身。除撤消历史记录外,已删除的文本已全部消失。拖到黑洞寄存器或从黑洞寄存器粘贴基本上没有任何作用。
黑洞寄存器"_允许您执行以下操作,例如先进行一个小删除,然后将许多其他删除操作更改为"_,而无需更改您的小删除寄存器"-,然后粘贴您的第一个小删除。
您可能已经很熟悉普通的命名寄存器,它们只是寄存器"a-"z,您可以随意将它们用作暂存空间。如果您以大写形式"A-"Z引用命名寄存器,则将其附加而不是替换其内容。
其他寄存器是最后插入的寄存器".,文件名寄存器"%"#,即命令寄存器":,搜索寄存器"/和表达式寄存器"=
您可以使用命令:register获取所有这些寄存器的列表及其内容。因为它显示了寄存器的当前内容,所以该命令对于进行实验并了解最终结果非常有用。

#3 楼

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

您可以使用以下映射使操作更简单:

nnoremap <leader>d "_d


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

#4 楼

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



#5 楼

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

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

#6 楼

要重复粘贴,请使用change命令。

cw ^ R0ESC(^ R = Control + R; 0表示寄存器0)

将用reg中的内容替换单词。 0,然后用。

重复此操作。这对于cgn(VIM 7.4)替换搜索模式非常有用:


用/或*

cgn ^ R0ESC


。在下一场比赛中重复或n跳过


#7 楼

由于尚未包含该字符串,因此通常用:%s/.../.../替换字符串,并且也可以使用光标下方的单词来执行此操作。


您输入命令的第一部分,即搜索::s/find/

然后单击<ctrl-r>并用光标选择要替换为的单词。
然后单击<ctrl-w>(小“单词”)或<ctrl-a>(大单词) ),将光标下的单词粘贴到命令行中。
然后完成命令。

请参阅有关如何在命令行中使用光标内容的链接。

#8 楼

我通常使用这个方法:yw来拉动foo,然后用dw删除bar,最后一步是,从寄存器foo中放入0,该寄存器使用“ 0p。”来保存拉出的文本。根据需要重复使用句点(。)。

另外,除了yw和dw外,还可以使用yiw和diw(注意,额外的i-表示内部),这样您就可以从其中的任何位置拉动或删除单词,而不仅仅是在单词的开头。 br />

#9 楼

添加到其他更好的答案。有点太明显了,但是您可以在删除之前简单地粘贴。
“是”,然后输入要替换的单词“ pldw”(粘贴,向右移动一个字符,删除单词。

评论


如果要替换该行的第一个单词,通常,如果光标位于该单词的第一个字母上,则应为Pldw:大写“ P”,粘贴到光标之前,然后向右移动一个字符,删除单词。

–Paul Rougieux
20年7月23日在9:38

#10 楼

我使用此插件扩展选择区域:
https://github.com/terryma/vim-expand-region

,所以我更改单词的组合将是:vvp在任何地方一个字。

我也有一个技巧,可以在粘贴后保存未命名的寄存器内容,以便我可以重复此操作。

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>


#11 楼

我正在使用下面的键映射将当前单词替换为复制的单词。请复制一个单词。导航到一个单词。 ,rr替换单词。
主键映射到..

评论


,rw会更有意义,并且在QWERTY上可能更容易,更快捷地进行发布。在DVORAK上,我选择了.rc,尽管这根本没有多大意义,但它比所有人都更容易,更快。在DVORAK上,rw是恐怖表演;)

– Paul Parker
19年3月3日1:00



#12 楼

首先,导航到要拉动的单词的开头。如果您在单词的中间,请执行b以回到单词的开头。然后执行ye来抽取整个单词,而没有任何尾随空格(ye nd)。最后,转到您要替换的单词-可能要执行几次w-并执行vep进入v等值选择模式,选择单词的e,然后p将上一次拉出的内容丢弃。

(如果有人想知道为什么我不只是简单地评论接受的答案,对于使用ye而不是yw的微小修改,这是因为我在该堆栈上的声誉仍然太低。)

评论


您可以使用yiw或yaw来避免导航到单词的开头,这意味着拉动内部单词或拉动所有单词。

– nils petersohn
20 Mar 20 '20在15:36

#13 楼

我的建议/建议:vim-exchange插件。它有助于交换这样的单词:

将第一个单词标记为要交换的单词-> cxiw,然后按点.

如果您使用的是vim-plug,请使用:

Plug 'tommcdo/vim-exchange'


然后

:PlugInstall


如果使用其他插件管理器,请遵循文档

#14 楼

将以下行添加到vimrc文件中。
“更改”不带缓冲。
nnoremap c "_c
vnoremap c "_c

奖金
“删除”不带缓冲。
nnoremap d "_d
vnoremap d "_d

下面2行使vim和系统复制/粘贴互通。例如:如果您从浏览器复制文本,则可以使用P命令将其粘贴。反之亦然。
set clipboard=unnamed
set clipboard=unnamedplus


#15 楼


使用yw提取单词,转到要更改的单词。
根据情况,使用v选择单词,vevw
输入p粘贴单词复制以替换选定的块。