2
4

5 回答 5

2

从我的~/.vimrc

nnoremap <leader>d "_d
vnoremap <leader>d "_d

只需将第一个d替换dd<leader>d. 那少了一把钥匙。

例子:

4,dd
,dt:
Vjj,d
于 2012-05-23T16:18:12.373 回答
2

这是一个有趣的想法。基本上,你想要一个“聪明”的删除。这意味着您需要定义一个新的运算符。

如何定义一个新的操作符在 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等。这只是一个开始。

于 2013-04-02T09:38:42.820 回答
1

使用以下命令重新映射d到:"_d

nnoremap d "_d
vnoremap d "_d

这将重新映射d正常和可视模式。请注意,如果您有任何其他映射或调用该d命令的函数,则必须进行调整,否则它将调用 default d,而不是新"_d映射。

于 2012-05-23T16:19:33.347 回答
1

另一种解决方案是使用"0寄存器。您抽出的东西以及默认寄存器都存储在那里,因此您可以在删除行后使用它来放置。

所以你会做这样的事情:

yy  # Yank your line
p   # put the yank
dd  # delete a line
"0p # put the yank

对于一些更用户友好的 yanking 和 put 功能,您可以使用YankRing 插件之类的东西。我想有可能更新 YankRing 以实现您正在寻找的那种功能。

于 2012-05-23T16:39:19.713 回答
0

所以基本上,你想重复"_dd而不必"_再次按下?

只需使用.,它将重复整个最后一个编辑序列。例如,这会将两个“Hello”行删除到_

/Hello
"_dd
N.

要回答您问题的第一部分,"_d$(删除到行尾,进入黑洞寄存器)是完全有效的,就像"_d/foo<enter>“从光标删除到'foo'第一次出现的开头,进入黑色保持寄存器”。

于 2012-05-23T16:53:37.330 回答