5 回答
从我的~/.vimrc
:
nnoremap <leader>d "_d
vnoremap <leader>d "_d
只需将第一个d
替换dd
为<leader>d
. 那少了一把钥匙。
例子:
4,dd
,dt:
Vjj,d
这是一个有趣的想法。基本上,你想要一个“聪明”的删除。这意味着您需要定义一个新的运算符。
如何定义一个新的操作符在 Vim 帮助中描述:h :map-operator
。
巧妙删除的代码将包括以下内容:
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
等。这只是一个开始。
使用以下命令重新映射d
到:"_d
nnoremap d "_d
vnoremap d "_d
这将重新映射d
正常和可视模式。请注意,如果您有任何其他映射或调用该d
命令的函数,则必须进行调整,否则它将调用 default d
,而不是新"_d
映射。
另一种解决方案是使用"0
寄存器。您抽出的东西以及默认寄存器都存储在那里,因此您可以在删除行后使用它来放置。
所以你会做这样的事情:
yy # Yank your line
p # put the yank
dd # delete a line
"0p # put the yank
对于一些更用户友好的 yanking 和 put 功能,您可以使用YankRing 插件之类的东西。我想有可能更新 YankRing 以实现您正在寻找的那种功能。
所以基本上,你想重复"_dd
而不必"_
再次按下?
只需使用.
,它将重复整个最后一个编辑序列。例如,这会将两个“Hello”行删除到_
:
/Hello
"_dd
N.
要回答您问题的第一部分,"_d$
(删除到行尾,进入黑洞寄存器)是完全有效的,就像"_d/foo<enter>
“从光标删除到'foo'第一次出现的开头,进入黑色保持寄存器”。