我如何删除一行而不把它放在我的默认缓冲区?

例子:

line that will be copied.

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

我想做的是:

yy
dd
p

但是Vim用删除的字符串替换最近复制的字符串。我知道我可以使用缓冲区,“1yy, dd然后”1p,但我总是忘记把复制的字符串放在缓冲区中,然后我需要先粘贴我的内容(将被复制的行),然后删除我想要的(我想用前一个替换的行)。

我如何才能真正删除Vi(m)中的文本而不复制它?

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


您可以使用“_d”来防止重写被拉出的文本。你可以用"在任何你想要的寄存器中存储删除或删除的文本,而_是'黑洞'寄存器,在那里你可以发送你不关心的东西。

要了解更多信息,您可以键入:help "_或:help deleting


使用“黑洞寄存器”,“_来真正删除一些东西:”_d。 使用“_dP”来粘贴一些东西,并保持它可用于进一步粘贴。

对于第二个问题,可以使用<C-o>dw。<C-o>用于不退出插入模式执行普通命令。

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

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

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

nnoremap d "_d
vnoremap d "_d

黑洞寄存器“_”将达到目的,但有一个更好的解决方案:

当你用p命令返回一行时,你是在粘贴(易失性)默认寄存器""的内容,它已经被dd覆盖了。但是你仍然可以粘贴(非易失性)yank寄存器"0,它不会被删除命令dd覆盖。

这些是你想要使用的命令:

yy
dd
"0p

以下映射将产生:

D => "delete" Leader d => "cut"

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的详细信息


yy
Vx
p

在可视化模式下,x会删除选定项,所以如果要删除整行,请先在可视化模式下按V选中该行,然后按x删除选定项。


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

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

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


最后我得到了

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

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


还有另一种解决方案。包括复制 一行复制一行删除,就像这样。

将光标放在行开头进行复制,然后输入ddVp

Dd终止要复制的行 V选择要替换的整行 P粘贴灭线在视觉选择

现在被杀死的行在“1寄存器”中,而被复制的行 在“2寄存器”中。没有什么损失。

我使用vim 9,我不知道哪个旧版本的vim可以工作。如果这不起作用,你可以把这些行放在你的。vimrc中:

使p在可视模式下用“”寄存器替换所选文本。vnoremap p <Esc>:let current_reg = @"<CR>gvdi<C-R>=current_reg<CR><Esc>