vim-如何使用当前粘贴缓冲区执行“更改单词”


86

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

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

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

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

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

Answers:


120

选项1

您可以使用寄存器来做到这一点,并对该过程进行键绑定。

用您要替换的单词来表示yw

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

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

对应的地图如下所示(假设Ctrl+ j作为我们的主要组合):

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

选项2(更简单)

拖拉单词后,将光标移到要替换并执行的单词上viwp。视觉上选择内部单词并粘贴。

在评论中@tlo的礼貌:您也可以这样做vep。缩短一个字符。下行必须将光标定位在单词的开头,并且(与我的一样)更改缓冲区。

评论(来自迈克尔):

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


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

仅需更改一个单词时,我喜欢选项3。如果要更改的单词不止一个,则选项1允许我使用。运算符重复它
。.– typelogic

3
ve"0p会让您重复更改
JKillian

如果要将其映射到某些内容,则最好使用map <C-j> ciw<C-r>0<ESC>它:这样,无论您按单词的哪个位置都没有关系^j
Paul Parker

任何想知道CTRL-R为何如此神奇的人::help insert然后搜索CTRL-R /CTRL-R。有关ve"0p工作原理,请看:help registers
保罗·帕克

12

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

您可以使用以下映射使事情变得简单一些:

nnoremap <leader>d "_d

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


3

为此,您有意使用yank,delete和其他寄存器。

寄存器"0是拉环寄存器。您要拖曳的所有内容都将放在此处,但删除绝对不要触摸register "0

因此,在您的示例中,您刚刚提出了一个要求。要将单词替换为您刚刚提出的内容,您可以利用从未碰过yank寄存器的删除功能。因此,移至目标词,使用删除它dw,然后使用"0p或从yank-register中粘贴,或者更好(cw然后^R0可重复)。

与yank寄存器相对的是小删除寄存器"-。任何小的删除或更改删除都放在此处,但猛拉绝对不会碰到"-。如果删除少于整行,则删除计数为小。

寄存器"1- "9是删除历史记录寄存器。具有"1包含最新的大型删除或更改删除,以及"9包含最旧的大型删除或更改删除。仅将不小的删除(即删除一行或更多行)推送到"1-上"9

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

寄存器"_是黑洞寄存器,并且始终为空。如果删除它,则任何寄存器中的任何内容都不会更改,甚至默认""寄存器或黑洞寄存器本身也不会更改。除撤消历史记录外,已删除的文本已全部消失。拖到黑洞寄存器或从黑洞寄存器粘贴基本上没有任何作用。

黑洞寄存器"_使您可以执行以下操作:先进行一个小删除,然后再进行许多其他删除,"_而无需更改您的小删除寄存器"-,然后粘贴您的第一个小删除。

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

您可以通过命令获取所有这些寄存器及其内容的列表:register。该命令对于试验和了解最终结果非常有用。


2

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

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


2

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

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

将用reg中的内容替换单词。0,让我们用.

这对于cgn(VIM 7.4)替换搜索模式非常有用:

  • 使用/或进行首次搜索*
  • cgn ^R0ESC
  • .在下一场比赛中重复或n跳过

1

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

  1. 输入命令的第一部分,搜索内容: :s/find/
  2. 然后单击<ctrl-r>并用光标选择要替换的单词。
  3. 然后单击<ctrl-w>(小“单词”)或<ctrl-a>(大“单词”)以将光标下方的单词粘贴到命令行中
  4. 然后,您完成命令。

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


1

我通常使用这样的:yw将拔掉foo,然后删除bardw,并作为最后一步,把foo从寄存器0持有使用抽出文本"0p.根据需要重复使用句号()进行推杆。

另外,您可以使用和来代替ywdw,(请注意额外的内容-表示在里面)。这样,您可以抽出或从任何位置删除字里面呢,不只是一个字的开头。yiwdiwi


0

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

因此,我更改单词的组合将是:vvp在单词的任何位置。

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

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

(我的剪贴板是自动选择的)


0

我正在使用下面的键映射将当前单词替换为复制的单词。
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiw复制一个字。导航到一个单词。,rr替换单词。
领导者钥匙映射到,


,rw会更有意义,并且在QWERTY上可能更容易,更快捷地推出。在DVORAK上,我选择了,rc,尽管它根本没有多大意义,但它比所有人都更容易,更快。在DVORAK上,这,rw是一个恐怖节目;)
Paul Parker

0

首先,导航到要拉动的单词的开头。如果您在单词的中间,则只需b回到单词的开头即可。然后ye,将整个单词抽出,没有任何尾随空格(从yank到end)。最后,转到您要替换的单词-也许要做w几次-并执行a vep进入v惯用的选择模式,选择e单词的nd,然后丢弃上次拉出p的内容。

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


0
  1. 用于yw吸引世界,进入您想要改变的世界。
  2. 用于v选择世界,vevw取决于您的情况。
  3. 输入p粘贴您复制的世界以替换所选块

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.