Vim,如何删除到“U”的空行自动地

Vim,如何删除到“U”的空行自动地,vim,Vim,当我们使用*N*dd或d*motion*删除空行时,如何让Vim总是将内容删除到“ EDIT1: 例如,我在某个地方写了“Hello”,然后用yy猛拉它。 然后我将光标移到别处,通过N+dd将一些空行移到“\u0”,而不显式指示寄存器”\u0, 然后我可以用p在适当的行中粘贴“Hello” EDIT2: 我们是否可以通过让vim检查已删除的内容并相应地编辑寄存器来实现这一点? (我想根据要删除的内容修改N+dd的行为。) (虽然将引导键d映射到“\u d效果很好,但当我以这种方式工作时,我仍然必

当我们使用
*N*dd
d*motion*
删除空行时,如何让Vim总是将内容删除到

EDIT1:

例如,我在某个地方写了“Hello”,然后用
yy
猛拉它。 然后我将光标移到别处,通过
N+dd
将一些空行移到“\u0”,而不显式指示寄存器
”\u0
, 然后我可以用
p
在适当的行中粘贴“Hello”

EDIT2:

我们是否可以通过让vim检查已删除的内容并相应地编辑寄存器来实现这一点? (我想根据要删除的内容修改
N+dd
的行为。)


(虽然将
引导键d
映射到
“\u d
效果很好,但当我以这种方式工作时,我仍然必须告诉自己:“嘿,你在删除空行,应该使用特殊键”。

来自我的
~/.vimrc

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

使用以下命令将
d
重新映射到
“\u d

nnoremap d "_d
vnoremap d "_d

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

另一种解决方案是使用
“0
寄存器。你拉的东西和默认寄存器都存储在那里,所以你可以在删除行后使用它来放置

所以你会这样做:

yy  # Yank your line
p   # put the yank
dd  # delete a line
"0p # put the yank
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

对于一些更为用户友好的拉绳和推杆功能,您可以使用类似的功能。我想可能还可以更新YankRing以实现您想要的功能。

因此,基本上,您想重复
“\u dd
,而不必再次按
”\u

只需使用
,它将重复上一次编辑序列的全部内容。例如,这会将两行“Hello”都删除到
\uuu

/Hello
"_dd
N.

为了回答你问题的第一部分,
“\u d$
(删除到行尾,进入黑洞寄存器)是完全有效的,正如
”\u d/foo
,这将是“从光标删除到“foo”第一次出现的开始,进入黑洞寄存器”。这是一个有趣的想法。基本上,您希望有一个“聪明”的删除。这意味着您需要定义一个新的运算符

如何定义新的操作员,请参见下的Vim帮助

聪明删除的代码包括如下内容:

yy  # Yank your line
p   # put the yank
dd  # delete a line
"0p # put the yank
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
nnoremap d:set opfunc=CleverDeleteg@
功能!克利夫德莱特(类型)
让注册表保存=@@
如果a:type=#“line”
正常[V']ygv
如果@@=~'\%^\\u s*\%$'
正常!“\u d
让@@@reg\u保存
其他的
正常
恩迪夫
elseif a:type=#“char”
" ...
“托多
其他的
“托多
恩迪夫
端功能
这适用于逐行删除:
dj
变成
“\u dj
,如果它只删除空白


现在您需要实现字符删除、可视模式映射、v:count
处理、行映射dd等。这只是一个开始。

发布特定的输入和所需的输出please@KevinDTimmto“u”表示:进入
黑洞
寄存器