我爱vim,但一个常见的问题是:
显然,工作流程首先是删除,然后是第二个。但如果我没有拥有,那将是非常好的。有人有这个诀窍吗? vim是否有一个运行良好的粘贴缓冲区,或者我可以更改.vimrc设置吗?
答案 0 :(得分:296)
传递到_
寄存器,即黑洞。
删除一行而不将其粘贴在寄存器中:
"_dd
这可能是最安全的,如果你想反复粘贴一些东西,把它拉到一个“命名”的寄存器中。
"aY
在a
注册表中划线。用"ap
粘贴它。
答案 1 :(得分:166)
你的猛拉线应该仍然在寄存器0中。所以
"0p
粘贴该行(并随时删除)
答案 2 :(得分:81)
默认情况下,所有yank和delete操作都会写入未命名的寄存器。但是,最近的删除和最近的删除始终(单独)存储在编号的寄存器中。 注册0
拥有最近的一次。寄存器1-9
包含最近的9个删除(1
是最新的删除)。
换句话说,删除会覆盖未命名寄存器中最近的一个yank,但它仍然存在于0
寄存器中。黑洞注册技巧("_dd
)在其他答案中提到的有效,因为它可以防止覆盖未命名的寄存器,但这不是必需的。
您使用双引号引用寄存器,因此可以像这样粘贴最近出现的文本:
"0p
这是一个很好的参考:
答案 3 :(得分:38)
另一种可能性是:
像往常一样拉扯你的线条
转到要粘贴的位置,进入可视线模式(V
)
选择要替换的行
点击p
粘贴你的行。
这还有一个额外的好处,即缓冲区与替换内容“交换”
答案 4 :(得分:23)
我使用以下映射来更容易删除黑洞寄存器:
nnoremap R "_d
这样,dd
变为Rd
,d$
变为R$
。请注意,R
通常必须进入替换模式,但我发现我从未使用过,因此最容易记住“真正删除”功能的密钥。
答案 5 :(得分:8)
" 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
答案 6 :(得分:5)
我写了this plugin (yankstack.vim)来解决这个问题。它为vim提供了Emacs's kill ring之类的东西。您可以抽取或删除多个内容,执行粘贴,然后在您的已删除/已删除文本的历史记录中来回循环。我发现它比记住我把东西塞进去的寄存器更容易。
在我的.vimrc中,我有这些映射:
nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste
让我点击ALT-p或ALT-SHIFT-p在我的粘贴历史记录中来回循环。
答案 7 :(得分:4)
对于您的具体问题,被问及,您不能只交换最后两个步骤的顺序吗?
当然,我通常会使用一个命名寄存器来处理这类事情,但有时解决方案比首先想到的更简单。
答案 8 :(得分:1)
您可以使用寄存器:"<register><command>
E.g:
这会将一行放入注册a
,删除另一行,然后粘贴注册a
"ayy` (move) `dd"aP
答案 9 :(得分:1)
您还可以尝试以下脚本:ReplaceWithRegister at vim.org/scripts/
答案 10 :(得分:1)
我发现所有这些关键组合都很麻烦。相反,我编写了一个函数来打开和关闭vim从删除操作覆盖缓冲区的“副作用”行为。这样你就可以关闭它,自由删除,然后在你完成后重新打开。
请在此处查看我的回答:https://stackoverflow.com/a/12649560/778118
要使用它,只需将其放入.vimrc
即可答案 11 :(得分:0)
如果你是一个邪恶的用户,你可以考虑重新映射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,所以它只是将你的调用重新路由到删除,好像”_已经按下了寄存器。
答案 12 :(得分:0)
诀窍在于你知道你想抓住一些东西然后移动,而你正在使用'懒惰'的第一个寄存器(它被你刚删除的任何东西取代)。
你需要学会在vim中“剪切”。
删除前,请指定不同于"
的寄存器。提示:使用:reg
现在,在任何命令之前按"
选择一个新的寄存器(显然在命令模式下)
1
)并删除:"1d
或"1x
或甚至"1c
"1p
或"1P
完成。这也有解决用例的优点:从一个地方删除5个不同的东西,每个部分去往不同的目的地......只需将"1
中的一个放在"2
中,依此类推...... 。去每个目的地并粘贴。