VIM是否将word替换为粘贴缓冲区的内容?

VIM是否将word替换为粘贴缓冲区的内容?,vim,replace,buffer,paste,Vim,Replace,Buffer,Paste,我需要在一个文件中进行大量的单词替换,并希望使用vi命令,而不是EX命令,如:%s///g。我知道这是在当前光标位置替换单词的典型方式:cw,但有没有办法将未命名寄存器的内容作为替换文本,而不覆盖寄存器?我认为“粘贴”是指未命名(yank/put/change/delete/substitute)寄存器,对吗?(因为这是一个会被change命令覆盖的命令。) 寄存器通常通过键入“然后键入寄存器的名称(单个字符)来指定,如“ay然后键入“ap猛拉入寄存器a,然后放入寄存器a的内容。更改命令也是如此

我需要在一个文件中进行大量的单词替换,并希望使用vi命令,而不是EX命令,如
:%s///g
。我知道这是在当前光标位置替换单词的典型方式:
cw
,但有没有办法将未命名寄存器的内容作为替换文本,而不覆盖寄存器?

我认为“粘贴”是指未命名(yank/put/change/delete/substitute)寄存器,对吗?(因为这是一个会被change命令覆盖的命令。)

寄存器通常通过键入
然后键入寄存器的名称(单个字符)来指定,如
“ay
然后键入
“ap
猛拉入寄存器
a
,然后放入寄存器
a
的内容。更改命令也是如此。在这种情况下,如果您不希望使用change命令删除的文本移动到任何地方,您可以使用黑洞寄存器
“\uu
”\ucw
。然后,在插入模式下,您可以按ctrl-R,然后按想要放入寄存器内容的寄存器(可能是

  • “*
    -选择寄存器(中间按钮粘贴)
  • “+
    -剪贴板寄存器(也可以通过终端使用ctrl-shift-v进行访问)
  • -vim的默认(未命名)yank/put/change/delete/substitute寄存器
简短回答:
“\u cw^R”

编辑:正如其他人所建议的,您当然可以为将文本放入默认寄存器的yank(或其他类型)使用不同的寄存器。但是,您并不总是首先想到这一点,因此执行单个更改命令而不将其吹走是很好的。尽管它没有完全吹走。有编号的寄存器
”0
“9

Vim使用yank和delete命令中的文本填充这些寄存器

编号寄存器0包含来自最新yank命令的文本,除非该命令使用[“x]指定了另一个寄存器

编号寄存器1包含最近的delete或change命令删除的文本,除非该命令指定了另一个寄存器或文本少于一行(然后使用小删除寄存器)。对于具有以下移动命令的删除运算符,将出现例外情况:
%
`
//code>,
n
n
{/code>和
}
。然后始终使用寄存器“1”(这与Vi兼容)。如果删除在一行内,也使用“-寄存器

随着每次连续的删除或更改,Vim将寄存器1的先前内容移到寄存器2,将寄存器2移到寄存器3,依此类推,从而丢失先前的内容 登记册9的内容


如果使用命名寄存器(即使用
“ay
”ad
等填充粘贴寄存器),可以执行以下操作

cwa


它将用寄存器
a
的内容替换单词。据我所知,您不能使用默认寄存器,因为当您
cw
时,它将被该命令剪切的单词填充。

您可以使用寄存器:

寄存器中的第一位替换文本
“ay

其中
a
是寄存器名

然后,您可以使用该寄存器进行替换


ve”ap

您指的是系统粘贴缓冲区还是vi寄存器

如果您想使用系统粘贴缓冲区,则可以执行
dw”+p
-
选择寄存器,
”+
是系统粘贴缓冲区


否则,使用say
“ay
复制到非默认寄存器中,以复制到寄存器
a
中,然后替换do
dw“aP

您可以使用vim的可视模式进行此操作。e、 g.复制一个单词:
ye
,然后用复制的单词覆盖另一个单词:
vep

使用本文中的信息,我形成了这个有用的映射。我选择“cp”是因为它表示“更改粘贴”

nmap-cp“\u-cw”

编辑:

我更进一步,支持任何动议

要获得上述命令的等效项,它将是“更改粘贴单词”的
cpw

“这允许更改粘贴运动cp{motion}”
nmap cp:set opfunc=ChangePasteg@
函数!更改粘贴(类型,…)
无声exe“正常`[v`]\“\U c”
静默exe“正常!p”
端功能

或者您可以执行Shift+v-p(选择整行并粘贴到其位置)

如果光标位于要替换为未命名寄存器内容的单词上,您可以使用
viwp
v
切换到可视模式,
iw
选择内部字,
p
将寄存器的内容放置到位


实际上,当我需要用另一个词替换一个词(函数名等)时,我将移动到要用作替换的词,
yiw
将内部词拖动到未命名寄存器,然后移动到我要替换的词,并
viwp
替换它。用一个词替换另一个词的很快的方法。如果您在(
/
)中搜索要替换的单词以找到它,则只需点击
n
即可找到下一个需要替换的单词。显然没有什么可以替代使用
:%s/find/replace/g
,但是对于几个快速替换来说,它是很方便的,尤其是如果你的寄存器中已经有了新词。

你可以使用
yw
来拖动这个词,然后,您可以通过
vipw
将具有拖动单词的单词更改为拖动单词并粘贴以前拖动的单词。

您可以使用默认寄存器!看看我的答案。好吧,我想我已经在我的答案中复制了足够多的注册文档了吗?都在
:帮助注册下
"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction