ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Vim 中删除(不剪切)?

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

例子:

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 的东西。


c
cutemachine

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

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

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

yy
dd
"0p

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

使用“黑洞寄存器”,"_ 来真正删除某些内容:"_d
使用 "_dP 粘贴某些内容并使其可供进一步粘贴。

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

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

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

thx,你回答了我的两个问题。但我不明白这些 noremap 命令将如何帮助我。我失去了剪切功能,对吗?
不,d 仍然“剪切”,而 p 仍然“粘贴”,而 <leader>d 删除真正的内容,而 <leader>p 丢弃选定的文本并粘贴默认寄存器的内容。 <leader>p 允许我多次粘贴相同的文本,而无需使用命名寄存器。
你不是说nnoremap <leader>d "_ddxnoremap <leader>d "_dd吗?就像现在一样,它等待下一个序列。
@AmirA.Shabani 这是有意的。这些 <leader>d 映射的重点不是替代 dd,而是替代 d,后者等待动作。
天哪,我简直不敢相信我从来没有对 <C-o> 感到陌生。拉德!
k
kprobst

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

nnoremap d "_d
vnoremap d "_d

那你怎么剪?
v/Vx 也被剪切。在任何操作系统中,使用 x 进行切割也与 Ctrl + x 一致。
p
pazams

以下映射将产生:

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


我希望我能不止一次地支持这个答案——我使用的是 kprobst 的答案,但后来为了剪线,我不得不使用 yydd,这在我的手指 ;-) 上有点不可持续。
在此之后,intellij 的想法表现得很奇怪。 dd什么都不做。 ,d 什么都不做
我非常喜欢这个解决方案。对我不起作用的一件事是用 ,dd 切割线。添加 nnoremap <leader>dd ""dd 后它开始工作
p
pb2q

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

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


q
qz3065863

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

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

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


m
mowwwalker

我结束了

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

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


A
Atemu
yy
Vx
p

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


这会将删除的行复制到剪贴板中,这正是 OP 想要避免的。
谢谢!不知何故,这在 Emacs 的 Evil 插件上完美运行