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

plo*_*ong 110 vim buffer replace paste

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

Cas*_*bel 125

我想通过"粘贴"你的意思是未命名的(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运算符与这些移动命令作出%,(,),`,/,?,n,N,{}.然后使用寄存器"1"(这是Vi兼容).如果删除在一行内,也使用" - 寄存器".

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


ost*_*r.c 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
Run Code Online (Sandbox Code Playgroud)

  • 可能有一种更好的方法来添加寄存器命名,但以下对我有用:`nmap <silent> cp:let g:currentRegister = v:register <cr>:set opfunc = ChangePaste <CR> g @ function!ChangePaste(type,...)silent exe"normal!\`[v \`] \"_ c".getreg(g:currentRegister)endfunction` (2认同)

小智 27

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

  • 这有效,但还应注意,可视粘贴会覆盖新删除文本的缓冲区缓冲区. (9认同)

Tra*_*utt 22

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

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

  • 令我感到惊讶的是,这不是公认的解决方案:所有上述内容,虽然在某些*边缘情况下更灵活,但对于简单地"将当前未命名的寄存器交换到某处选择"更加冗长,这是最初的提问者来到这里的情况. (4认同)
  • 这非常有用且直观。 (3认同)

Dan*_*uis 5

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

cw<CTRL-R>a<esc>

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