我喜欢vim,但一个常见的问题是:

拉起一条线 去你想粘贴的地方 删除已有内容 粘贴你的yank,却发现它粘贴了你刚刚删除的内容

显然,工作流是先删除,再删除。但如果我不这么做就太好了。有人有诀窍吗?vim是否有一个工作良好的粘贴缓冲区,或者是否有一个我可以更改的.vimrc设置?


当前回答

我使用下面的映射使删除黑洞寄存器更容易一些:

nnoremap R "_d

这样,dd变成了Rd, d美元变成了R美元。请注意,R通常会进入替换模式,但我发现我从未使用过这种模式,所以对于“真正的删除”特性来说,它是最容易记住的键。

其他回答

另一种可能性如下:

像平常一样拉你的线 切换到你想要粘贴的位置,进入可视线条模式(V) 选择要替换的行 按p粘贴你的行。

这还有一个额外的好处,即缓冲区与被替换的内容进行了“交换”,我认为这非常方便

" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp

传递到_寄存器,黑洞。

删除一行而不将其插入寄存器:

"_dd

请参见:帮助寄存器。

这可能是最安全的,如果你想要一遍又一遍地粘贴某个东西,把它拉到一个“命名”寄存器中。

"aY

猛拉一根线到收银台。用“ap”粘贴。

诀窍是你知道你想要抓取一些东西并移动,你正在使用“lazy”第一个寄存器(它会被你刚刚删除的东西所取代)。

你需要学会在vim中“切割”。

在删除之前,指定与“one.”不同的任何寄存器。提示:用reg检查你的寄存器

现在,通过在任何命令之前按“”(显然是在命令模式下)来选择一个新寄存器

选择你想要“切割”的部分(或者在步骤2中指定一个范围) 将寄存器更改为任何东西(这里是1)并删除:“1d或”1x或甚至“1c” 去新的地方,删除更多 现在你已经准备好粘贴你切割并存储在寄存器1:"1p或"1p

完成了。这也有解决用例的优势:从一个地方删除5个不同的东西,每一块都去了不同的目的地……只要把一个放进“1”,另一个放进“2”,等等……转到每个目标并粘贴。

如果您是一个恶意用户,您可以考虑重新映射X,以实现与“_d”等价的功能。然而,完善实现对我来说有点棘手。尽管如此,我还是发现

(define-key evil-normal-state-map "X" 'evil-destroy)
(define-key evil-visual-state-map "X" 'evil-destroy)

(evil-define-operator evil-destroy (beg end type register yank-handler)
  "delete without yanking text"
  (evil-delete beg end type 95 yank-handler)
)

积分很好。例如,输入XX将类似于dd, X$对于d$, X0对于d0,等等……

如果你好奇它是如何工作的,“95”代表“_寄存器”,所以它只是重新路由你的删除调用,就好像“_已经被按下了寄存器。