当我们使用"_
或*N*dd
删除空行时,我们怎么能让Vim始终将内容删除到d*motion*
?
EDIT1:
例如,我在某处写了“Hello”,然后用yy
猛拉它。
然后我将光标移动到其他位置,将N+dd
的一些空行删除到“_”,而不明确指示寄存器"_
。
然后,我可以使用p
粘贴“Hello”。
EDIT2:
我们可以通过让vim检查已删除的内容并相应地编辑寄存器来实现这一目的吗??
(我想修改N+dd
的行为,具体取决于我要删除的内容。)
(虽然将leader-key d
映射到"_d
效果很好,但是当我以这种方式工作时,我仍然要告诉自己:“嘿,你要删除空行,你应该使用特殊的键“。)
答案 0 :(得分:2)
来自我的~/.vimrc
:
nnoremap <leader>d "_d
vnoremap <leader>d "_d
只需将d
中的第一个dd
替换为<leader>d
即可。这不是关键。
示例:
4,dd
,dt:
Vjj,d
答案 1 :(得分:1)
使用以下命令将d
重新映射到"_d
:
nnoremap d "_d
vnoremap d "_d
这将为正常和可视模式重新映射d
。请注意,如果您有任何调用d
命令的其他映射或函数,则必须进行调整,否则它将调用默认的d
,而不是新的"_d
映射。
答案 2 :(得分:1)
另一种解决方案是使用"0
寄存器。你抽出的东西都存储在那里以及默认的寄存器中,这样你就可以在删除行后使用它。
所以你会做这样的事情:
yy # Yank your line
p # put the yank
dd # delete a line
"0p # put the yank
对于一些更友好的yanking&amp;放置功能,你可以使用YankRing plugin之类的东西。我想也许可以更新YankRing来实现你正在寻找的那种功能。
答案 3 :(得分:1)
这是一个有趣的想法。基本上,你想要一个“聪明”的删除。这意味着您需要定义一个新的运算符。
:h :map-operator
下的Vim帮助中描述了如何定义新运算符。
聪明删除的代码包括以下内容:
nnoremap <silent> d :<C-U>set opfunc=CleverDelete<CR>g@
function! CleverDelete(type)
let reg_save = @@
if a:type ==# 'line'
normal! '[V']ygv
if @@ =~ '\%^\_s*\%$'
normal! "_d
let @@ = reg_save
else
normal! d
endif
elseif a:type ==# 'char'
" ...
" TODO
else
" TODO
endif
endfunction
这适用于行式删除:dj
如果只删除空格,则变为"_dj
。
现在你需要实现字符删除,可视模式映射,v:count
处理,行式映射dd
等。这只是一个开始。
答案 4 :(得分:0)
基本上,您想重复"_dd
而无需再次按"_
?
只需使用.
,它将重复整个上一个编辑序列。例如,这会将“Hello”行删除到_
:
/Hello
"_dd
N.
要回答问题的第一部分,"_d$
(删除到行尾,进入黑洞寄存器)完全有效,"_d/foo<enter>
就是“从光标中删除”到'foo'第一次出现的开始,进入黑色保持寄存器“。