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保持“原样”,因此您可以使用该方法对同一文本进行多次替换。
#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
来抽取整个单词,而没有任何尾随空格(y
到e
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
选择单词,ve
或vw
。输入
p
粘贴单词复制以替换选定的块。
评论
选项3(甚至更简单):选中单词后,将光标放在要替换的单词的第一个字符上并进行vep。
– tlo
2014年9月9日在22:10
仅需更改一个单词时,我喜欢选项3。如果要更改的单词不只一个,则选项1允许我使用。操作员重复一遍。
–本征场
18-09-20在17:36
ve“ 0p会让您重复更改
– JKillian
19年2月6日在19:03
如果要将其映射到某些对象,则最好使用:map
– 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