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

Vim 在可视块中粘贴替换剪贴板,vim,Vim,假设我的vim剪贴板中有“the”一词。 如果我进入VisualBlock,选择一个单词(假设这个单词是“a”)并粘贴。 “a”一词由“The”一词替换,我的剪贴板已更改:它现在包含“a”一词。粘贴到可视块时,如何更改此行为以不替换剪贴板?请参见:帮助注册表。您可以将文本拉入/放入指定的寄存器 举个例子,只需通过将“the”和”一词拉出来,将其放入寄存器b。然后,您就可以:将和“bp”放在一起。该文档非常明确地介绍了视觉模式粘贴。删除的内容将始终转到未命名寄存器(默认寄存器) 如果要重复粘贴同一

假设我的vim剪贴板中有“the”一词。 如果我进入VisualBlock,选择一个单词(假设这个单词是“a”)并粘贴。
“a”一词由“The”一词替换,我的剪贴板已更改:它现在包含“a”一词。粘贴到可视块时,如何更改此行为以不替换剪贴板?

请参见
:帮助注册表
。您可以将文本拉入/放入指定的寄存器


举个例子,只需通过
将“the”和
”一词拉出来,将其放入寄存器
b
。然后,您就可以
:将
“bp
”放在一起。该文档非常明确地介绍了视觉模式粘贴。删除的内容将始终转到未命名寄存器(默认寄存器)

如果要重复粘贴同一文本,建议使用命名寄存器。拖动“using
”xyw将其拖动到寄存器“x”,然后在视觉模式下使用
“xp
将其粘贴。寄存器
“x
将不会被该操作触动

请注意,编号的寄存器
“0
在这里非常有用,因为默认的yank也会转到
“0
寄存器,但是用put in visual mode替换的文本只转到未命名的寄存器,不会修改
“0

见:

先前选择的文本将放入未命名寄存器中。如果要将同一文本多次放入视觉选择中,则需要使用另一个寄存器。例如,拖动要复制的文本,目视选择要替换的文本并使用
“0p
。您可以重复多次,每次都会更改未命名的寄存器


另一个选项是通过创建自定义映射来覆盖该行为

您可以在可视模式下为
p
p
操作创建映射,以在操作前后保存和恢复未命名寄存器

这些函数和映射将实现以下功能:

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')
函数!SaveReg(cmd)中止
设b:saved_reg=getreg(“”)
设b:saved_type=getregtype(“”)
返回一个:cmd。“:\call RestxyzoreReg()\r”
端功能
函数!RestoreReg()中止
调用setreg(“”,b:saved_reg,b:saved_type)
取消设置b:已保存\u注册表
取消设置b:保存的\u类型
端功能
xnoremap SaveReg('p')
xnoremap SaveReg('P')

Hi@bob-我建议读取一些vim寄存器;这可能会消除一些混乱。Vim维护一堆自己的“剪贴板”,称之为寄存器。其中一个寄存器将始终包含您删除的最后一个文本-我相信这就是您看到的行为。在添加
:verbose set clipboard?
的值中有一些很好的详细信息和参考信息,这(ve“0p)确实有效,但我不能使用点(.)重复该命令。它只是删除选定的文本,但不会再次从yank寄存器中粘贴。您知道如何使其工作吗?@eclipse是的,
将不工作,因为它是两个独立的命令,首先执行视觉选择的
ve
,然后从寄存器0中放入的
“0p
。例如,为了使其可重复,可以使用它录制宏。