我喜欢使用vim,但经常会遇到以下问题:
- 复制一行
- 移动到希望粘贴的位置
- 删除该位置原有的内容
- 粘贴你之前复制的内容,却发现它粘贴了你之前删除的内容
显然,正确的操作是先删除再复制。但如果我不想这样做,有什么技巧可以解决吗?Vim是否有一个可靠的粘贴缓冲区,或者是否有我可以更改的.vimrc设置?
将内容传递到黑洞寄存器_
。
删除行而不将其粘贴到寄存器中:
"_dd
请参考 :help registers
。
如果你想要反复粘贴某个内容,最安全的做法可能是将其复制到一个“命名”寄存器中。
"aY
将一行文本复制到寄存器 a
中。使用 "ap
命令粘贴。<ctrl>-ra
,将寄存器 'a' 中的内容粘贴到当前位置。 - SergioAraujo你复制的那一行应该还在寄存器0中。所以执行:
"0p
粘贴该行代码(并随时删除)
0
设置为p
的默认寄存器。链接在这里:https://dev59.com/QXVD5IYBdhLWcg3wNIvc#32488853 - Torbennnoremap <C-p> :let @*=@0<CR>p
,这使我可以使用Ctrl-p将默认寄存器覆盖为寄存器0
,然后粘贴已复制的文本。 - schpet所有剪切和删除操作默认会写入未命名寄存器。但是,最近的剪切和最近的删除总是(分别)存储在编号寄存器中。寄存器0
保存了最近的剪切内容。寄存器1-9
保存最近的9个删除(其中1是最近的)。
换句话说,删除操作会覆盖未命名寄存器中最近的剪切内容,但它仍然存在于0
寄存器中。在其他答案中提到的黑洞寄存器技巧("_dd
)之所以有效是因为它防止覆盖未命名寄存器,但这并非必须。
您可以使用双引号引用寄存器,因此可以像这样粘贴最近剪切的文本:
"0p
这是一个很好的参考:
Ctrl-R 0
来粘贴上一次复制的内容。 - dimus还有一种可能性:
V
)p
来粘贴你的行这种方法也有一个额外的好处,即缓冲区与替换的内容“交换”,我发现非常方便。
X
和 P
(按住 Shift 键)在换行方面做得更好。 - Todd Owenvnoremap p "_dp
和 vnoremap P "_dP
。我认为这是结合你的v
命令的最佳解决方案。 - mikew我使用以下映射,使得删除到黑洞寄存器更加容易:
nnoremap R "_d
这样,dd
变成了 Rd
,而 d$
变成了 R$
。请注意,R
通常绑定到进入替换模式,但我发现我从未使用过它,因此它是“真正删除”功能的最容易记忆的键。
nnoremap d "_d
,è؟™و ·dd
ن»چ然وک¯dd
,d$
ç‰ن¹ںهگŒçگ†م€‚ - abhishek77in" 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
dd
仍然会用相同的寄存器替换已经复制的内容 yy
。 - Eric Duminilnmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste
这使我可以使用 ALT-p 或 ALT-SHIFT-p 在我的粘贴历史记录中来回切换。
当然了,我通常会使用一个命名寄存器来完成这种操作,但有时候解决方法比想象中简单。
V
选择要删除的行”替换最后两步,然后用p
覆盖它们。 - Rory O'Kane"<register><command>
例如:a
,删除另一行,然后粘贴寄存器a
。"ayy` (move) `dd"aP
如果你是一个恶意用户,你可能会考虑重新映射X来执行"_d"的等效操作。然而,对于我来说,完善这个实现有点棘手。尽管如此,我发现
(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”代表“_ register”,因此它只是重新路由您的调用以删除,就像“_”是按下的寄存器一样。
source $VIMRUNTIME/mswin.vim
和behave mswin
。 - Cristian Ciupitu*
寄存器。你可以使用vim命令将任意的移动内容复制到系统剪贴板,例如"*y/foo<enter>
将把光标到下一个 "foo" 的文本复制到Windows剪贴板中。(如果使用 mswin/Ctrl-C,你需要先进入可视化模式。) - dash-tom-bang