有没有办法在vim中删除而不覆盖你的最后一个yank?

有没有办法在vim中删除而不覆盖你的最后一个yank?,vim,vi,Vim,Vi,我喜欢vim,但一个常见的问题是: 拔掉一条线 转到要粘贴的位置 删除其中的内容 粘贴你的yank,却发现它粘贴了你刚刚删除的内容 很明显,工作流是先删除,后拖动。但如果我不必这么做,那就太好了。有人有这个窍门吗?vim是否有一个运行良好的粘贴缓冲区,或者是否有一个可以更改的.vimrc设置?传递到\u寄存器黑洞 要删除一行而不将其插入寄存器,请执行以下操作: "_dd 另见 如果你想一次又一次地粘贴某个东西,把它拉到一个“命名”的寄存器中可能是最安全的 "aY 将一行拖动到a寄存器中。

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

  • 拔掉一条线
  • 转到要粘贴的位置
  • 删除其中的内容
  • 粘贴你的yank,却发现它粘贴了你刚刚删除的内容

很明显,工作流是先删除,后拖动。但如果我不必这么做,那就太好了。有人有这个窍门吗?vim是否有一个运行良好的粘贴缓冲区,或者是否有一个可以更改的.vimrc设置?

传递到
\u
寄存器黑洞

要删除一行而不将其插入寄存器,请执行以下操作:

"_dd
另见

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

"aY

将一行拖动到
a
寄存器中。将其粘贴到
“ap

您可以使用寄存器:

例如:

这会将一行拉入寄存器
a
,删除另一行,然后粘贴寄存器
a

"ayy` (move) `dd"aP

对于您的具体问题,正如所问的,您不能交换最后两个步骤的顺序吗

  • yank线(相同)
  • 移动到新位置(相同)
  • 粘贴拉伸线(was步骤4)
  • 删除您不想要的行(是步骤3)

当然,我通常使用命名寄存器来处理这类事情,但有时解决方案比最初想到的要简单。

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

nnoremap R "_d

这样,
dd
变成
Rd
d$
变成
R$
。请注意,
R
通常会进入替换模式,但我发现我从未使用过该模式,因此最容易记住“真正删除”功能的键。

另一种可能性是:

像平常一样拉扯你的线

转到要粘贴它们的位置,进入可视线模式(
V

选择要替换的行

点击
p
粘贴行


这还有一个额外的好处,即缓冲区与被替换的内容“交换”

您还可以尝试以下脚本:

您被拖动的行应该仍在寄存器0中。我也是

"0p
要粘贴行(并在需要时删除)

我写这篇文章是为了解决这个问题。它给了你类似于vim的东西。您可以拖动或删除多个内容,进行粘贴,然后在拖动/删除文本的历史记录中来回循环。我发现这比记住我把东西拉进哪个寄存器更容易

在my.vimrc中,我有以下映射:

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste
nmap yankstack\u替换\u旧的\u粘贴
nmap yankstack_替换_更新_粘贴

这让我点击ALT-p或ALT-SHIFT-p在我的粘贴历史中来回循环

我觉得所有这些按键组合都很麻烦。相反,我编写了一个函数来打开和关闭vim的“副作用”,即从删除操作中覆盖缓冲区。这样你就可以关闭它,自由删除,然后在完成后再打开

请看我的回答:


要使用它,只需将其放入.vimrc中,默认情况下,所有yank和delete操作都会写入未命名寄存器。但是,最近的yank和最近的delete始终(单独)存储在编号的寄存器中寄存器
0
保存最近的yank
。寄存器
1-9
保存最近的9次删除(其中
1
是最近的一次)

换句话说,删除覆盖了未命名寄存器中最近的yank,但它仍然在
0
寄存器中。
其他答案中提到的黑洞寄存器技巧(
“\u dd
)有效,因为它可以防止覆盖未命名寄存器,但这不是必需的

您使用双引号引用寄存器,因此可以按如下方式粘贴最近拉伸的文本:

"0p
这是一个很好的参考:


如果你是一个邪恶的用户,你可以考虑重新映射X来做等同于“的”。然而,完善实现对我来说有点棘手。尽管如此,我发现

(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”代表“u”寄存器,因此它只是将您的删除调用重新路由,就好像“u”被按下了寄存器一样。

诀窍在于,您知道您想要抓取一些东西并移动,并且您正在使用“懒惰”第一个寄存器(它会被刚刚删除的内容所取代)

你需要学会在vim中“切入”

删除之前,请指定任何不同于
的寄存器。提示:使用
:reg

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

  • 选择要“剪切”的对象(或在步骤2指定一个范围)
  • 将寄存器更改为任意值(
    1
    此处)并删除:
    “1d
    “1x
    或甚至
    ”1c
  • 转到新位置,删除更多内容
  • 现在,您可以粘贴剪切并存储在寄存器1中的内容:
    “1p
    “1p

  • 完成。这也有解决用例的好处:从一个地方删除5个不同的东西,每个东西都会到达不同的目的地……只需将一个放在
    “1
    中,另一个放在
    “2
    等等。。。前往每个目的地并粘贴。

    Hah,我不知道黑洞记录。谢谢你的启发。黑洞寄存器是一个很好的选择,但我有时会发现:Vp是一个很好的选择,因为它比较短。请注意,未命名寄存器将填充先前选择的文本。+1用于提及黑洞寄存器。粘贴插入模式
    -ra
    粘贴寄存器'a'我发现它很有用
    " 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