vim 是否用粘贴缓冲区的内容替换单词?

2ledvvac  于 2023-03-18  发布在  其他
关注(0)|答案(9)|浏览(224)

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

8fq7wneg

8fq7wneg1#

我认为“粘贴”是指未命名的(yank/put/change/delete/substitute)寄存器,对吗?(因为它会被change命令覆盖)
通常通过键入"然后键入名称来指定寄存器(单个字符),比如"ay,然后"ap,将其插入寄存器a,然后放入寄存器a的内容。change命令也是如此。在这种情况下,如果不希望使用change命令删除的文本移动到任何地方,你可以使用黑洞寄存器"_"_cw。然后,一旦进入插入模式,您可以按ctrl-R,然后按您想要放入该寄存器内容的寄存器(可能是")。

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

简短回答:x1米11米1x
编辑:正如其他人所建议的,你当然可以使用一个不同的寄存器来处理把你的文本放入默认寄存器的操作(或者其他什么),但是你并不总是首先想到这个,所以最好是执行一个change命令而不把它吹走,尽管它并没有完全吹走,这里有编号寄存器"0"9
Vim使用来自yank和delete命令的文本填充这些寄存器。
编号寄存器0包含最近一次yank命令的文本,除非该命令用[“x]指定了另一个寄存器。
编号寄存器1包含最近删除或更改命令删除的文本,除非命令指定了另一个寄存器或文本少于一行(此时使用小删除寄存器)。以下移动命令的删除操作符例外:%()、```、/?nN{}。则始终使用寄存器“1(这与Vi兼容)。如果删除在一行内,则也使用“-寄存器。
随着每一次连续的删除或改变,Vim将寄存器1的先前内容移位到寄存器2中,将寄存器2移位到寄存器3中,以此类推,丢失寄存器9的先前内容。

0lvr5msh

0lvr5msh2#

使用这篇文章中的信息,我形成了这个有用的Map。我选择'cp'是因为它表示“更改粘贴”
nmap <silent> cp "_cw<C-R>"<Esc>
编辑:
此外,我更进一步,支持任何动议。
要获得与上面命令等效的命令,“change paste word”应为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
p8ekf7hl

p8ekf7hl3#

你可以使用vim的可视化模式来完成这个任务。例如,复制一个单词:ye,然后用复制的单词覆盖另一个:vep

wz1wpwve

wz1wpwve4#

如果光标位于要用未命名寄存器的内容替换的单词上,则可以使用viwpv切换到可视模式,iw选择内部单词,p将寄存器的内容放到它的位置。
实际上,当我需要替换一个单词时(函数名等)替换为另一个,我将移到要用作替换的那个,yiw将内部的单词拉到未命名的寄存器,然后移到要替换的单词,和viwp来替换它。用一个词替换另一个词的相当快的方法。如果你搜索(/)来找到你要替换的单词,你可以点击n来找到你需要替换的下一个单词。显然,:%s/find/replace/g没有替代品,但是对于一些快速替换来说,它会很方便,特别是如果你已经在寄存器中有了新单词。

oaxa6hgo

oaxa6hgo5#

如果使用命名寄存器(例如,使用"ay"ad等来填充粘贴寄存器),则可以执行如下操作
cw<CTRL-R>a<esc>
这将用寄存器a的内容替换这个字,据我所知,你不能使用默认寄存器,因为当你cw时,它将被那个命令剪切的字填充。

hmae6n7t

hmae6n7t6#

你指的是系统粘贴缓冲区还是vi寄存器?
如果你想使用系统粘贴缓冲区,那么你可以做dw"+P-"选择一个寄存器,"+是系统粘贴缓冲区。
否则,复制到非默认寄存器,例如"ay复制到寄存器a,然后执行dw"aP替换某些内容

thigvfpy

thigvfpy7#

您可以使用yw来拉伸单词,然后您可以通过viwp来更改带有拉伸单词的单词,以拉伸内部单词并粘贴以前拉伸的单词。

jq6vz3qz

jq6vz3qz8#

寄存器可用于:
寄存器<mark some text>"ay中的第一位替换文本
其中a是寄存器名称
则可以使用该寄存器进行替换
ve"ap

pes8fvy9

pes8fvy99#

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

相关问题