在不进入插入模式的情况下插入空行

11

我经常在插入模式下敲击o或O和ctrl{来插入空白行并退出插入模式。

想着一定有更简单的方法,并希望保留我的光标位置,我编写了以下这些不太优雅的宏:

map <Leader>O :let cursorpos = getpos(".")<CR>:i<CR><CR>.<CR>:let cursorpos[1] = cursorpos[1] + 1<CR>:call setpos('.', cursorpos)<CR>
map <Leader>o :let cursorpos = getpos(".")<CR>:a<CR><CR>.<CR>:call setpos('.', cursorpos)<CR>

然而,这种方法并不支持范围。希望能够输入5\O并在当前行上方输出5个空白行。

有没有什么建议可以解决这个问题,使其支持范围,并在完成后返回到原始光标位置?

3个回答

12
您可以使用:call append(linenumber, repeat([''], 5))。 它不会移动光标。

3
太好了,非常完美。我想肯定有更加优雅的方式。将其改为:map O :call append(line(".") -1, repeat([''], v:count1)) map o :call append(line("."), repeat([''], v:count1))以响应范围。谢谢! - Jamey Pearce
但是在这个例子中,如果我们应用“计数版本”,它也会上下移动光标。 - user3663882
@user3663882。我们需要将 :call 替换为 :<c-u>call,并将 5 替换为 v:count1。或者保留 5 并以 <C-\><C-N><esc> 开始命令以清除计数。 - Luc Hermitte

10

unimpaired插件添加了您想要的映射。您可以使用[<space>在光标上方插入空行,或者使用]<space>在光标下方插入空行。这两个映射都可以附加计数。


2

我把这个添加到了我的 .vimrc 文件中

"create new line below current line without leaving normal mode or moving cursor
noremap - m`o<Esc>``
"create new line above current line without leaving normal mode or moving cursor
noremap _ m`O<Esc>``

出于以下几个原因,我更喜欢这种解决方案:

  • 在正常模式下,我通常不使用 -_ 键,而它们位于我的键盘上的同一物理键上。
  • 安装插件似乎有些大题小作。对于简单的事情,我避免下载插件,因为它们会向我的环境引入新代码,我还没有完全理解或信任它们,并且它们可能会干扰其他自定义或插件。
  • 我尝试了这个问题的作者在接受答案下的评论中提供的解决方案,但使用后,. 命令会产生奇怪和令人不安的结果。
  • 我通常更喜欢多次按下 . 而不是传递数字参数,这样我只需不断按下 . 直到看起来正确为止(不需要概念化视觉,而是更多实际的视觉)。不幸的是,即使使用这种解决方案,. 命令也不能按照我想要的方式工作。但是,通过映射 -_,可以重复按下这些键以达到相同的效果。只可惜它离主键盘区域太远了...

警告: 标记 ` 键会影响跳转列表。如果有其他标记可以使用,那么请使用其他标记。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接