如何用vim折叠多个空白行?

时间:2015-08-31 03:56:33

标签: regex vim

question and answers here详细介绍了以下vim命令如何将一系列空行折叠为一行:

:g/^$/,/./-j

但是,我想要做同样的事情,但也要将只有白色空格的行视为空白。我尝试了以下命令,但它不起作用:

:g/^\s*$/,/./-j

据我所知,这应该找到空的行,并且只有空格,但并非所有行都被折叠。

1 个答案:

答案 0 :(得分:1)

你已经到了一半。

请记住,初始命令由搜索部分和动作部分组成。搜索部分:g/^$/找到了所有空行,并为每个行执行了行动部分,/./-j(好的,每个尚未被之前的j删除)。

您对字符串的搜索部分所做的修改是正确的,因为它现在会找到空行或只包含空格的行。

但是,你正在执行的动作会导致你的悲伤。在找到的行上执行的原始操作是,/./-j,这基本上意味着在从该行到下一个“真实”字符之前的范围内执行连接j。有关如何工作的更多细节可以在您链接的问题中找到。

它在您的情况下找到的第一个“真实”字符实际上包含空格,因此,当搜索位将找到空白行并对其进行操作时,操作中的连接范围将不会是你想要的。

你需要为动作范围的末尾指定的是下一行之前的行,其中包含 other 而不是空白(而不仅仅是具有任何'真实'字符的行)。具有非空白字符的行只是与正则表达式\S匹配的行(带有大写S的反斜杠表示非空白字符)。

所以,最后,你要找的是:

:g/^\s*$/,/\S/-j

话虽如此,请记住,留下的线是(我认为)第一个来自范围。所以,它不一定是空的,它可能包含空格。

如果您希望确保所有仅空白行都为空,请执行:

:g/^\s*$/s/.*//

在上面的折叠命令之后。或者,您可以使用|作为操作分隔符将两者合并为一个命令:

:g/^\s*$/,/\S/-j|s/.*//