【问题标题】:How to delete (not cut) in Vim?如何在 Vim 中删除(不剪切)?
【发布时间】:2022-01-18 11:59:30
【问题描述】:

如何删除一行而不将其放入我的默认缓冲区?

例子:

line that will be copied.

line that I want to be substitued with the previous one.

我正在尝试做的事情:

yy
dd
p

但是 Vim 将最近复制的字符串替换为已删除(剪切)的字符串。我知道我可以使用像"1yydd 然后"1p 这样的缓冲区,但我总是忘记将复制的字符串放在缓冲区中,然后我需要先粘贴我的内容(将被复制的行)然后删除我想要的(我想用前一个替换的行。)

如何在不复制的情况下真正删除 Vi(m) 中的文本?

另一个相关问题是如何在插入模式下转发删除单词?我想要类似于 Ctrl+w 的东西。

【问题讨论】:

标签: vim copy-paste


【解决方案1】:

黑洞寄存器 "_ 可以解决问题,但有更好的解决方案:

当您使用p 命令返回该行时,您将粘贴(易失性)默认寄存器 "" 的内容,该内容已被dd 覆盖。但您仍然可以从(非易失性)yank 寄存器 "0 粘贴,不会被删除命令dd 覆盖。

所以这些是您要根据您的示例使用的命令:

yy
dd
"0p

【讨论】:

  • 太好了,这应该是公认的答案。每当我想粘贴时手动指定寄存器比每次删除任何内容时都保持指定寄存器要容易得多。
  • "0p 并没有完全从指尖滚落,但我想我可以习惯这一点!
【解决方案2】:

使用“黑洞寄存器”"_ 真正删除某些内容:"_d
使用"_dP 粘贴某些内容并保留它以供进一步粘贴。

对于第二个问题,您可以使用<C-o>dw<C-o> 用于在不离开 insert 模式的情况下执行普通命令。

当然,您可以设置自己的映射来节省输入。我有这些:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP

【讨论】:

  • 谢谢,你回答了我的两个问题。但我不明白这些 noremap 命令将如何帮助我。我失去了剪切功能,对吗?
  • 不,d 仍然“剪切”,p 仍然“粘贴”,而&lt;leader&gt;d 删除为真实,&lt;leader&gt;p 丢弃选定的文本并粘贴默认寄存器的内容. &lt;leader&gt;p 允许我多次粘贴相同的文本,而无需使用命名寄存器。
  • 你不是说nnoremap &lt;leader&gt;d "_ddxnoremap &lt;leader&gt;d "_dd吗?就像现在一样,它等待下一个序列。
  • @AmirA.Shabani 这是有意的。这些&lt;leader&gt;d 映射的重点不是替代dd,而是替代d,后者等待动议。
  • 天哪,我不敢相信我从来没有对&lt;C-o&gt; 感兴趣。辐射!
【解决方案3】:

这是我不喜欢 vim 的原因之一...我最终将 dd 映射到我的 .vimrc 中的黑洞寄存器,从此生活一直很美好:

nnoremap d "_d
vnoremap d "_d

【讨论】:

  • 那你怎么剪?
  • v/Vx 也被剪切。在任何操作系统中使用x 进行切割也与Ctrl + x 保持一致。
【解决方案4】:

将产生以下映射:

  • d => "删除"
  • 领导者 d => “切”
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

nnoremap <leader>d ""d
nnoremap <leader>D ""D
vnoremap <leader>d ""d

另外,将“leader”键设置为逗号是一个很好的做法, 例如:

let mapleader = ","
let g:mapleader = ","

这 2 个 sn-ps 将使 ",d" 成为您的新剪切命令。

如果您想将这些映射与共享系统剪贴板配置一起使用,请参阅https://github.com/pazams/d-is-for-delete 的更多详细信息

【讨论】:

  • 我希望我能多次投票赞成这个答案——我使用的是 kprobst 的答案,但后来为了剪线,我不得不使用yydd,这在我的手指上有点不可持续;-) .
  • 智能想法在此之后表现得很奇怪。 dd什么都不做。 ,d 什么都不做
  • 我非常喜欢这个解决方案。对我不起作用的一件事是使用,dd 切割线。添加nnoremap &lt;leader&gt;dd ""dd后,它开始工作了
【解决方案5】:

您可以使用"_d 来防止内容覆盖您拉出的文本。您可以使用" 将删除或删除的文本存储在您想要的任何寄存器中,_ 是“黑洞”寄存器,您可以在其中发送您不关心的内容。

更多信息您可以输入:help "_:help deleting

【讨论】:

    【解决方案6】:

    我在我的 .vimrc 中使用 noremap ' "_

    这保留了dd的行为,所以我可以像以前一样使用它来剪切。

    但是当我真的想删除某些东西时,只需使用前缀'。例如:'dd,'dw

    【讨论】:

      【解决方案7】:

      我最终得到了

      nnoremap p "0p
      nnoremap P "0P
      vnoremap p "0p
      vnoremap P "0P
      vnoremap x "0x
      nnoremap x "0x
      

      始终从 0 寄存器而不是未命名的寄存器粘贴。在可视模式下使用x删除到0寄存器。

      【讨论】:

        【解决方案8】:
        yy
        Vx
        p
        

        在可视模式下,x 将删除所选内容,因此如果要删除整行,请先按V 在可视模式下选择该行,然后按x 删除所选内容。

        【讨论】:

        • 这会将删除的行复制到剪贴板中,这正是 OP 想要避免的。
        • 谢谢!不知何故,这在 Emacs 的 Evil 插件上完美运行
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 2011-10-05
        相关资源
        最近更新 更多