Vim 相当于 Emacs 的 Cx Co (删除空白行)吗?

Vim 相当于 Emacs 的 Cx Co (删除空白行)吗?

Vim 中与 Emacs 的C-x C-o( delete-blank-lines) 函数对应的功能是什么?

答案1

Vim 没有内置函数可以做到这一点。可能最“类似 vim”的方法是定义一个文本对象

文本对象是 vim 中极其有用的功能,它允许您执行如下操作:

dip     "(d)elete (i)nside (p)aragraph

或者

yaW    "(y)ank (a)round this (W)ORD

我们可以为“空行”定义一个文本对象。让我们使用“e”作为助记符。这意味着我们正在寻找的特征是

die    "delete inside this empty block (leaving one blank line)

dae    "Delete around this empty block (Leaving no blank lines)

文本对象的优点在于,添加它会使其他所有运算符也起作用。因此,您也可以执行cie,或yie。以下是要添加到您的.vimrc

vnoremap ie :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr>k<cr>
onoremap ie :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr>k<cr>
vnoremap ae :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr><cr>
onoremap ae :<C-u>silent! normal! ?^.?+1<C-v><cr>V/^./-1<C-v><cr><cr>

我不会费心去解释其中的每一个(因为它们大多数非常相似)但基本思想是我们映射ie到这组正常模式的击键:

?^.?+1<C-v><cr>V/^./-1<C-v><cr>k

让我们详细分析一下:

?               " Search backwards
 ^.             " For a non-blank line
   ?+1          " And offset to one line forward. (So that we find the first blank after a non-blank)
      <C-v><cr> " Enter. (The <C-v> is necessary because we enter it from :normal

"Start a visual selection
V

/                   " Search forwards
 ^.                 " For a non-blank line
   /-1              " And offset to one line backwards. 
      <C-v><cr>     " Enter. (The <C-v> is necessary because we enter it from "normal"
               k    " (optional) if this is an 'i' mapping, not an 'a' mapping, move up one line so that we leave a line

这不是确切地与 emacs 一样。但话又说回来,毕竟你使用的是 vim。你不应该尝试复制完全相同的功能。这将为你提供类似的功能,同时仍保持相同的“vim 风格”感觉。

相关内容