MacVim:如何粘贴多次相同的已复制单词?

4
每次我想将一个词替换成多个词时,我会执行以下步骤:
  1. 复制这个词
  2. 进入可视模式,选择要替换的单词并粘贴复制的单词。
此过程之后,被替换的词将被复制,并且无法继续替换新词,因为我已经丢失了第一个复制的词。所以,我必须重新复制第一个复制的词。
有没有人能指导我如何以高效的方式实现我的目标?如果我的复制的单词不会改变,那就足够了。

4
帮助文件(:h v_p)建议使用"0p - Nabb
1
黑洞寄存器,是的!例如:https://dev59.com/QXVD5IYBdhLWcg3wNIvc - Cascabel
不,黑洞寄存器几乎解决了问题,但仅仅是“几乎”。有关详细信息,请查看我的答案。 - dorserg
6个回答

8
我建议为您的拷贝和粘贴显式地使用一个寄存器。
  1. 使用"ayw或您选择的任何方式来复制单词。
  2. 使用"ap进行粘贴。
在这种情况下,我使用了a寄存器,但您可以使用适合您的任何寄存器。

在插入模式下尝试使用 Ctrl-r a,其中的 'a' 对应创建的记录。 - SergioAraujo

2

这个问题之前已经有人回答过了: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()

1

就我个人而言,我更喜欢使用:s/word/replacement words/gc来进行操作。

或者,您可以使用"_de来删除要替换的单词。"_表示使用“黑洞”缓冲区以防止丢失现有的默认缓冲区内容。

也许比这更好的方法是将替换词复制到另一个命名缓冲区(例如"a3ye),然后您可以删除要替换的单词(de)并粘贴命名缓冲区"ap


1

对@Randy Morris的回答进行补充:您可以仅在第二种情况下指定寄存器,而不必在两种情况下都显式指定,参见:h quote0(“编号为0的寄存器包含最近一次复制命令的文本...”)。在这种情况下,使用a寄存器更好(因为它更容易输入),但如果您说要替换单词,则可能需要使用ciw<C-r>0,然后每个要替换的其他单词使用一个.。


0

我不使用yank,而是用ciw,然后用.重复。

例如:

进入您想要替换的单词中的某个位置。

执行ciw <键入新单词> Esc

进入下一个要替换的单词中的某个位置。

.重复上次替换。

高级:

您还可以先使用/<word>查找单词,然后使用ciw <new word>。 然后您就不必自己移动到单词之前再按.,而是可以使用n转到下一个(或N转到上一个)。


0
我使用这个映射将当前选定的文本替换为默认寄存器,而不是复制它:
vnoremap <leader>p "_dP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接