Vim:删除光标周围的空行

Dan*_*nor 10 vim

假设我正在编辑以下文档(*= cursor):

Lions
Tigers


Kittens
Puppies


*


  Humans
Run Code Online (Sandbox Code Playgroud)

我可以使用什么序列来删除周围的空白区域,以便我留下:

Lions
Tigers


Kittens
Puppies
*
  Humans
Run Code Online (Sandbox Code Playgroud)

注意:我正在寻找一个处理任意数量空行的答案,而不仅仅是这个案例.

编辑1:行号未知,我只想影响我的光标所在的范围.

编辑2:编辑示例以显示我需要保留边缘上的前导空格

谢谢

glt*_*lts 10

简单.在正常模式下,dipO<Esc>应该这样做.

说明:

  • dip 在空行上删除它和所有相邻的空白行.
  • O<Esc> 打开一个新的空行,然后返回正常模式.

更简洁,cip<Esc>将这两个步骤合二为一,正如@Lorkenpeist所建议的那样.

  • 辉煌!稍微好一点:`cip <Esc>` (4认同)

Pet*_*ker 7

可能的解决方案是使用:join带有范围的命令:

:?.?+1,/./-1join!
Run Code Online (Sandbox Code Playgroud)

说明:

  • [range]join!将联合起来[range].!没有插入任何额外空间的手段.
  • 起点是向后搜索第一个字符然后向下搜索1行, ?.?+1
  • 由于1+1可以假设这可以简写?.?+
  • 结束点是向前搜索下一个字符然后向上搜索1行, /./-1
  • 与之前的1假设相同,/./-
  • 由于我们使用相同的模式,因此只能向前搜索模式. //-
  • 该命令:join可以简化为:j

最终缩短的命令:

:?.?+,//-j!
Run Code Online (Sandbox Code Playgroud)

以下是一些可能很方便的相关命令:

1)删除所有空行:

  • :g/^$/d
  • :v/./d

2)将所有空行挤压成1个空行:

  • :v/./,//-j

有关更多帮助请参阅:

:h :j
:h [range]
:h :g
:h :v
Run Code Online (Sandbox Code Playgroud)