Vim,如何自动将空行删除到" _?

时间:2012-05-23 15:35:04

标签: vim

当我们使用"_*N*dd删除空行时,我们怎么能让Vim始终将内容删除到d*motion*

EDIT1:

例如,我在某处写了“Hello”,然后用yy猛拉它。 然后我将光标移动到其他位置,将N+dd的一些空行删除到“_”,而不明确指示寄存器"_。 然后,我可以使用p粘贴“Hello”

EDIT2:

我们可以通过让vim检查已删除的内容并相应地编辑寄存器来实现这一目的吗?? (我想修改N+dd的行为,具体取决于我要删除的内容。)

(虽然将leader-key d映射到"_d效果很好,但是当我以这种方式工作时,我仍然要告诉自己:“嘿,你要删除空行,你应该使用特殊的键“。)

5 个答案:

答案 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'第一次出现的开始,进入黑色保持寄存器“。