211

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

例子:

line that will be copied.

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

我正在尝试做的事情:

yy
dd
p

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

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

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

4

8 回答 8

192

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

当您使用p命令输入该行时,您将粘贴(易失性)默认寄存器 ""的内容,该寄存器已被dd. 但是您仍然可以从 (non volatile) yank register 粘贴 "0,不会被 delete 命令覆盖dd

因此,这些是您要根据您的示例使用的命令:

yy
dd
"0p
于 2012-12-18T15:52:32.810 回答
177

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

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

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

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP
于 2012-08-16T19:13:18.920 回答
57

那是我不喜欢 vim 的地方之一......我最终映射dd到我的 .vimrc 中的黑洞寄存器,从那以后生活一直很好:

nnoremap d "_d
vnoremap d "_d
于 2012-08-16T19:23:30.210 回答
33

以下映射将产生:

  • 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 = ","

这两个片段将使“,d”成为您的新剪切命令。

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

于 2015-05-24T13:15:32.460 回答
10

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

有关更多信息,您可以键入:help "_:help deleting

于 2012-08-16T19:13:08.947 回答
1

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

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

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

于 2021-04-25T02:11:55.307 回答
0

我结束了

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

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

于 2022-01-18T00:33:22.377 回答
-1
yy
Vx
p

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

于 2017-11-03T14:41:51.110 回答