Vim:删除光标周围的空行

时间:2013-03-12 18:21:38

标签: vim

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

Lions
Tigers


Kittens
Puppies


*


  Humans

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

Lions
Tigers


Kittens
Puppies
*
  Humans

注意:我正在寻找一个能够处理任意数量空行的答案,而不仅仅是这种情况。

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

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

由于

6 个答案:

答案 0 :(得分:10)

易。在正常模式下,dipO<Esc>应该这样做。

说明:

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

更简洁, cip<Esc> 会将这两个步骤合并为一个,如@Lorkenpeist所示。

答案 1 :(得分:7)

一种可能的解决方案是使用范围为{/ p>的:join命令

:?.?+1,/./-1join!

说明:

  • [range]join![range]行加在一起。 !表示不插入任何额外空格。
  • 起点是向后搜索第一个字符,然后向下搜索1行?.?+1
  • 由于可以假设1中的+1,因此可以缩写?.?+
  • 结束点是向前搜索下一个字符,然后向上搜索1行,/./-1
  • 1可以假设/./-
  • 之前相同
  • 由于我们使用相同的模式,因此只能向前搜索模式。 //-
  • 命令:join可以缩短为:j

最终缩短的命令:

:?.?+,//-j!

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

1)删除所有空行:

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

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

  • :v/./,//-j

如需更多帮助,请参阅:

:h :j
:h [range]
:h :g
:h :v

答案 2 :(得分:3)

简答: ()V)kc<esc>

在正常模式下,如果键入(),光标将移至第一个空白行。 (将光标移动到前一个非空行块的开头,)将光标移动到末尾(具体地说,移动到所述块之后的第一个空白行)。然后,一个简单的d)将删除所有文本,直到下一个非空白行的开头。所以完整的序列是()d)

编辑:你没错,删除下一​​个非空白行开头的空格。而不是d)尝试V)kdV使您进入可视线模式,)跳转到第一个非空行(跳过行开头的空白),k将光标向上移动一行。此时您已选择所有空白行,因此d会删除所选内容。

最后,键入O(大写O),然后转义以创建一个新的空行以替换您删除的空行。或者,将dO<Escape>替换为c<Escape>,只需少一次击键即可完成同样的操作,因此整个序列将为()V)kc<Esc>

答案 3 :(得分:1)

更新后的问题后,这些答案无关紧要:

这可能不是你想听到的答案,但我会利用范围。看一下第一个空行的行号(比方说55例)和第二行到最后一行(可能是67行)。然后只需:55,67d

或许,您可能只希望整个文件中都有一个空行。在这种情况下,您可以匹配任何一个或多个空行的出现,并用一个空行替换它们。

:%s/\(^$\n\)\+/\r/

这个答案有效:

如果您只想使用普通模式,可以在其上搜索最后一行。例如,

/.<Enter>kkVNjd

答案 4 :(得分:1)

我没有测试过这么多,但它应该适用于你的例子。可能有更优雅的解决方案。

function! DelWrapLines()
    while match(getline('.'),'^\s*$')>=0
        exe 'normal kJ'
    endwhile
    exe 'silent +|+,/./-1d|noh'
    exe 'normal k'
endfunction

获取并尝试:call DelWrapLines()

答案 5 :(得分:0)

我知道这个问题已经解决了,但我刚刚在“sed&amp; awk,2nd Ed”中找到了一个很好的解决方案。 (O'Reilly)我认为值得分享。它根本不使用vim,而是使用sed。此脚本将使用单个空行替换一个或多个空行的所有实例(假设这些行中没有空格)。在命令行上:

sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile

请记住,sed实际上并不编辑文件,而是将编辑过的行打印到标准输出。您可以将此输入重定向到文件:

sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile > tempfile

但是要小心,如果你试着直接把它写到myfile,它只会删除文件的全部内容,这显然不是你想要的!将输出写入tempfile后,您可以mv tempfile myfile和tada!多个空行的所有实例都被一个空行替换。

更好:

cat -s myfile > temp
mv temp myfile

猫真棒,是吗?

<强> BESTEST:

如果你想在vim中进行,你可以使用vim在vim内的一系列行上执行shell命令的方便功能,用一个空白行替换多个空白行的所有实例。

:%!cat -s

这就是所需要的,整个文件都重新格式化了!