Vim很棒,但是和很多人一样,当我想要复制,删除然后粘贴时,我真的很恼火–删除操作会覆盖猛拉缓冲区。

现在,我知道有101个变通方法和映射,其中一些在这样的帖子中进行了列举:Any way to delete in vim without overwriting your last yank?

但是所有这些解决方案都有缺点-甚至我还是一个缓冲区专家(我不是)。例如,多余的击键-尽管我通常xxxx会快速删除4个字符(只是按下一个击键,因为我按住它并等待自动重复),但现在切换到,x,x,x,x或无论使用什么映射,我都必须使用其他缓冲区。

真正理想的是模式切换,您可以切换D,D,X和X键的副作用行为,以便它们交替执行或不执行其文本操作。这样,我可以简单地进入“无副作用”模式并删除内容,然后在准备好时粘贴。并根据需要重新启用副作用。

有人知道这样做的方法吗?

[更新:解决方案]好吧,我明白了:我编写了一个函数来切换“无副作用”模式...完美运行!请在下面查看我接受的正确答案

[更新#2]我的解决方案仍然有效,在进行大量删除和粘贴操作时,我一直都在使用它。但是与此同时,对于要删除的文本是连续的简单情况,我也找到了一种更轻松的方法来满足复制,粘贴,删除的特定用例。

正常拉动文本后,然后使用v命令直观地突出显示要删除的文本,然后使用p命令简单地将其粘贴。无需任何特殊映射即可达到所需的效果。

此工作流程的唯一问题是,如果我想再次粘贴,则原始粘贴缓冲区会被粘贴在突出显示的文本上的行为所覆盖,但是通过.vimrc中的以下映射,可以轻松更改此行为:

vnoremap p "_dp
vnoremap P "_dP

最佳答案

好的,我明白了-.vimrc中的脚本使我可以有效地切换“无缓冲区副作用”模式,从而在激活“无缓冲区副作用”模式时d和x键不再覆盖缓冲区。

在.vimrc中添加

function! ToggleSideEffects()
    if mapcheck("dd", "n") == ""
        noremap dd "_dd
        noremap D "_D
        noremap d "_d
        noremap X "_X
        noremap x "_x
        echo 'side effects off'
    else
        unmap dd
        unmap D
        unmap d
        unmap X
        unmap x
        echo 'side effects on'
    endif
endfunction
nnoremap ,, :call ToggleSideEffects()<CR>


然后使用组合键,,(两个逗号)来切换该模式。

09-04 05:09
查看更多