VIM用粘贴缓冲区的内容替换单词?

时间:2010-03-18 15:43:55

标签: vim replace buffer paste

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

9 个答案:

答案 0 :(得分:122)

我想通过“粘贴”你的意思是未命名的(yank / put / change / delete / substitute)寄存器,对吧? (因为那是被改变命令覆盖的那个。)

通常通过键入"然后输入注册表的名称(单个字符)来指定注册表,例如"ay然后"ap以便注册到注册表a,然后输入登记册a的内容。更改命令也是如此。在这种情况下,如果您不希望使用change命令删除的文本转到任何位置,则可以使用黑洞寄存器"_"_cw。然后,在插入模式下,您可以按ctrl-R,然后按下您想要的寄存器(可能是")以放入该寄存器的内容。

  • "* - 选择寄存器(中键粘贴)
  • "+ - 剪贴板寄存器(也可通过终端使用ctrl-shift-v访问)
  • "" - vim的默认(未命名)yank / put / change / delete / substitute寄存器。

简短回答:"_cw^R"

编辑:正如其他人所建议的那样,您当然可以使用不同的注册表来获取将文本放入默认寄存器的yank(或其他)。但是,你并不总是首先想到这一点,所以做一个单一的更改命令而不是把它吹掉是很好的。虽然它并没有完全被吹走。编号寄存器"0"9

  

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

     

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

     

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

     

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

答案 1 :(得分:47)

使用这篇文章中的信息,我已经形成了这个有用的映射。我之所以选择'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

答案 2 :(得分:27)

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

答案 3 :(得分:19)

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

在实践中,当我需要将一个单词(函数名称等)替换为另一个单词时,我将移动到一个用作替换的单词,yiw将内部单词移动到未命名的寄存器,然后转到我正在替换的单词,并viwp替换它。用一个词代替另一个词的快速方法。如果您搜索(/)您要替换的单词,则可以点击n以进入您需要替换的下一个匹配项。显然不能替代使用:%s/find/replace/g,但是对于几个快速替换它可以很方便,特别是如果你已经在寄存器中有了新单词。

答案 4 :(得分:5)

如果您使用命名寄存器(即使用"ay"ad等来填充您的粘贴寄存器),您可以执行类似

的操作

cw<CTRL-R>a<esc>

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

答案 5 :(得分:2)

您的意思是系统粘贴缓冲区还是vi寄存器?

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

否则,请将"ay复制到非默认注册表中以复制到注册表a中,然后替换为dw"aP

的内容

答案 6 :(得分:1)

您可以使用yw来抓取该单词,然后您可以使用vipw的单词来改变单词,然后将单词拉出来并粘贴以前被拉出的单词。

答案 7 :(得分:0)

您可以使用寄存器:

首先将替换文本放入注册表中 <mark some text>"ay

其中a是注册名称

然后你可以在替换

中使用该寄存器

ve"ap

答案 8 :(得分:0)

或者你可以做 Shift + v - p (选择整行并粘贴在其​​位置)