每次我想将一个词替换成多个词时,我会执行以下步骤:
有没有人能指导我如何以高效的方式实现我的目标?如果我的复制的单词不会改变,那就足够了。
- 复制这个词
- 进入可视模式,选择要替换的单词并粘贴复制的单词。
有没有人能指导我如何以高效的方式实现我的目标?如果我的复制的单词不会改变,那就足够了。
"ayw
或您选择的任何方式来复制单词。"ap
进行粘贴。a
寄存器,但您可以使用适合您的任何寄存器。Ctrl-r a
,其中的 'a' 对应创建的记录。 - SergioAraujo这个问题之前已经有人回答过了:Vim:如何在不覆盖寄存器的情况下粘贴。
总体而言,简单的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()
就我个人而言,我更喜欢使用:s/word/replacement words/gc
来进行操作。
或者,您可以使用"_de
来删除要替换的单词。"_
表示使用“黑洞”缓冲区以防止丢失现有的默认缓冲区内容。
也许比这更好的方法是将替换词复制到另一个命名缓冲区(例如"a3ye
),然后您可以删除要替换的单词(de
)并粘贴命名缓冲区"ap
。
对@Randy Morris的回答进行补充:您可以仅在第二种情况下指定寄存器,而不必在两种情况下都显式指定,参见:h quote0(“编号为0的寄存器包含最近一次复制命令的文本...”)。在这种情况下,使用a寄存器更好(因为它更容易输入),但如果您说要替换单词,则可能需要使用ciw<C-r>0,然后每个要替换的其他单词使用一个.。
我不使用yank,而是用ciw
,然后用.
重复。
例如:
进入您想要替换的单词中的某个位置。
执行ciw <键入新单词> Esc
进入下一个要替换的单词中的某个位置。
按.
重复上次替换。
高级:
您还可以先使用/<word>
查找单词,然后使用ciw <new word>
。
然后您就不必自己移动到单词之前再按.
,而是可以使用n
转到下一个(或N
转到上一个)。
vnoremap <leader>p "_dP
:h v_p
)建议使用"0p
。 - Nabb