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 风格”感觉。