Replace word with contents of paste buffer?

I need to do a bunch of word replacements in a file and want to do it with a vi command, not an EX command such as :%s///g.

I know that this is the typical way one replaces the word at the current cursor position: cw<text><esc> but is there a way to do this with the contents of the unnamed register as the replacement text and without overwriting the register?

30641 次浏览

我想你说的“粘贴”是指未命名的(yank/put/change/delete/inib)寄存器,对吧?(因为它会被 change 命令覆盖。)

Registers are generally specified by typing " then the name (single character) of the register, like "ay then "ap to yank into register a, then put the contents of register a. Same goes for a change command. In this case, if you don't want the text you remove with the change command to go anywhere, you can use the black hole register "_: "_cw. Then once in insert mode, you can hit ctrl-R followed by the register you want (probably ") to put in the contents of that register.

  • 选择寄存器(中键粘贴)
  • "+ - clipboard register (probably also accessible with ctrl-shift-v via the terminal)
  • ""-vim 的默认(未命名) yank/put/change/delete/inib 寄存器。

简短回答: "_cw^R"

编辑: 正如其他人所建议的那样,您当然可以使用不同的寄存器来将文本放入默认寄存器中。但是,您并不总是首先考虑这个问题,所以执行一个单独的 change 命令而不会把它搞砸是一件很好的事情。虽然还没有完全消失。有编号寄存器 "0"9:

Vim 用来自 yank 和 delete 命令的文本填充这些寄存器。

编号寄存器0包含来自最近的 yank 命令的文本,除非该命令指定了另一个带有[“ x”的寄存器。

编号寄存器1包含由最近的删除或更改命令删除的文本,除非该命令指定了另一个寄存器或文本少于一行(然后使用小的删除寄存器)。使用这些移动命令的删除操作符例外: %()`/?nN{}。寄存器“1总是使用然后(这是 Vi 兼容)。如果删除在一行内,也使用“-register”。

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

如果你使用一个已命名的寄存器(即。使用 "ay或者 "ad等等来填充你的粘贴寄存器) ,你可以这样做

cw<CTRL-R>a<esc>

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

您可以使用寄存器:

在寄存器中放置替换文本 <mark some text>"ay

其中 a是寄存器名称

然后你可以用那个寄存器来替换

ve"ap

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

如果你想使用系统粘贴缓冲区,那么你可以做 dw"+P-"选择一个寄存器,而 "+是系统粘贴缓冲区。

Otherwise copy into the non-default register with say "ay to copy into register a and then to replace something do dw"aP

您可以为此使用 vim 的可视化模式。复制一个单词: ye,然后用复制的单词: vep覆盖另一个单词

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

nmap <silent> cp "_cw<C-R>"<Esc>

编辑:

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

为了获得上面命令的等价物,它将是 cpw,表示“更改粘贴单词”

"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

或者你可以选择 Shift + v-p(选择整行并粘贴到它的位置)

If your cursor is on the word you want to replace with the contents of the unnamed register, you can use viwp. v switches to visual mode, iw selects the inner word, and p puts the contents of the register in its place.

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

您可以使用 yw猛拉的单词,然后您可以改变与被猛拉的单词由 vipw猛拉的单词和粘贴以前猛拉的单词。