在可视块中粘贴替换剪贴板

4
假设我的vim剪贴板里有单词“the”。 如果我进入了可视块模式,选择了一个单词(我们假设这个单词是"a")并粘贴。 单词“a”被替换为单词“the”,但我的剪贴板已经改变了:现在它包含单词“a”。如何更改此行为,使得在可视块模式下粘贴时不替换我的剪贴板呢?

嗨@bob - 我建议你多了解一下vim寄存器,这可能会消除一些困惑。Vim维护了一堆自己的“剪贴板”,称为寄存器。其中一个寄存器将始终包含您最后删除的文本 - 我相信这就是您看到的行为。 - Lix
这篇文章中有一些很好的细节和参考资料:链接 - Lix
2
添加 :verbose set clipboard? 的值。 - Matt
2个回答

2
文档对于可视模式粘贴非常明确。删除的内容将始终进入未命名寄存器(默认寄存器)。
如果您想重复粘贴相同的文本,则建议使用命名寄存器。使用"xyw将"the"复制到寄存器"x"中,然后在可视模式下使用"xp进行粘贴。寄存器"x"不会被操作所改变。
请注意,编号为"0"的寄存器在这里可能非常有用,因为默认复制也会进入"0"寄存器,但在可视模式下用放置替换的文本只会进入未命名寄存器,不会修改"0"寄存器。
请参见:help v_p
之前选择的文本被放入了一个未命名的寄存器中。如果你想将同样的文本放入一个可视化选择中多次,你需要使用另一个寄存器。例如,复制文本并使用可视化选择替换文本,然后使用“0p”。你可以重复这个过程多次,未命名的寄存器每次都会改变。
另一个选项是通过创建自定义映射来覆盖该行为。
您可以在可视模式下为 pP 操作创建映射,以在操作之前和之后保存和恢复未命名寄存器。
以下函数和映射将执行此操作:
function! SaveReg(cmd) abort
    let b:saved_reg = getreg('"')
    let b:saved_type = getregtype('"')
    return a:cmd.":\<C-U>call RestxyzoreReg()\r"
endfunction
function! RestoreReg() abort
    call setreg('"', b:saved_reg, b:saved_type)
    unlet b:saved_reg
    unlet b:saved_type
endfunction

xnoremap <silent> <expr> p SaveReg('p')
xnoremap <silent> <expr> P SaveReg('P')

1
这个命令(ve"0p)是有效的,但我无法使用点(.)来重复执行该命令。它只会删除所选文本,但不会再次从yank寄存器中粘贴。你知道如何让它工作吗? - eclipse
1
@eclipse 是的,.不起作用,因为它是两个单独的命令,首先使用ve进行可视选择,然后使用"0p从寄存器0中粘贴。为了使其可重复,您可以例如记录一个宏。 - filbranden

1
请见:help registers。您可以将文本复制/粘贴到指定的寄存器中。
例如,使用"by仅复制单词"the",并将其放入寄存器b中。然后,您可以使用"bp命令将其粘贴。

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