每次我复制一个单词并希望将其替换为多个单词时,我会这样做:
在此过程之后,被替换的单词将被拉出并且无法继续替换新单词,因为我丢失了第一个被拉出的单词。所以,我必须再次复制第一个被拉扯的词。
有人可以指导我如何以有效的方式实现我的目标吗?如果我的语言不会改变,那就足够了。
答案 0 :(得分:7)
我建议明确地使用一个寄存器进行猛拉和粘贴。
"ayw
或者你选择了猛拉你的话。"ap
要粘贴。在这种情况下,我使用了a
注册表,但您可以使用适合自己的注册表。
答案 1 :(得分:2)
之前已经回答:Vim: how to paste over without overwriting register。
总的来说,粗略的vnoremap p "_dP
映射几乎可以让你到达那里,但在一些边缘情况下它不会很好(例如,如果你要替换的一个单词在行的末尾)。
优越的方法是使用这个看起来很疯狂的片段(我希望我知道Vimscript至少是这个作者的一半):
" replace visual selection without overwriting default register
function! RestoreRegister()
let @" = s:restore_reg
return ''
endfunction
function! s:Repl()
let s:restore_reg = @"
return "p@=RestoreRegister()\<cr>"
endfunction
vnoremap <silent> <expr> p <sid>Repl()
答案 2 :(得分:1)
就个人而言,我赞成做:s/word/replacement words/gc
。
或者,您可以使用"_de
删除要替换的字词。 "_
表示使用“黑洞”缓冲区来防止丢失现有的默认缓冲区内容。
也许比这更好的是将替换单词拉入另一个命名缓冲区(例如"a3ye
),然后你可以删除要替换的工作(de
)并粘贴命名缓冲区"ap
。
答案 3 :(得分:1)
@Randy Morris的一个补充回答:不是在两种情况下都明确指定寄存器,只能在第二种情况下指定寄存器,参见:h quote0
(«编号寄存器0包含最近的yank命令中的文本...»)。在这种情况下,使用a
寄存器会更好(因为它更容易输入),但如果您说要替换字词,则可能需要使用ciw<C-r>0
然后使用.
你要替换的每个其他词。
答案 4 :(得分:0)
我使用此映射将当前选定的文本替换为默认寄存器,而不是将其取消:
vnoremap <leader>p "_dP
答案 5 :(得分:0)
我不使用yank,而是使用ciw
,然后重复使用.
例如:
转到要替换的单词内的某个地方。
执行ciw <type new word> Esc
转到您要替换的下一个单词内的某个地方。
按.
重复上一次替换。
高级:
您还可以先使用/<word>
查找单词,然后使用ciw <new word>
。
这样,您在按.
之前就不必自己动词了,但是您可以使用n
转到下一个(或N
转到上一个)。