我需要在文件中做一堆单词替换,并希望使用vi命令,而不是:%s///g
之类的EX命令。我知道这是在当前光标位置替换单词的典型方式:cw<text><esc>
但有没有办法用未命名寄存器的内容作为替换文本而不覆盖寄存器?
答案 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}},n
,N
和{
。寄存器“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)
如果光标位于要替换为未命名寄存器内容的单词上,则可以使用viwp
。 v
切换到可视模式,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 (选择整行并粘贴在其位置)