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



这里的问题和答案详细介绍了以下vim命令如何将一系列空行折叠成一行:

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

然而,我想做同样的事情,但也将其中只有空格的行视为空白。下面的命令是我尝试的,但它不起作用:

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

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

你已经成功了一半。

请记住,初始命令由搜索部分和操作部分组成。搜索部分:g/^$/找到所有空行,操作部分,/./-j对每一行执行(好吧,每一行都没有被之前的j删除)。

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

然而,是你在那之后执行的动作让你感到悲伤。在查找到的行上执行的原始操作是,/./-j,这基本上意味着执行连接j,从这行到下一个"real"字符之前的范围。您可以在您链接到的问题中找到有关其工作原理的更多细节。

在你的情况下,它发现的第一个'真实'字符实际上包括空白,所以,虽然搜索位将找到空白行并对它们进行操作,但操作中的连接范围将不是你想要的。

您需要在操作中指定的范围的末尾是下一行之前的行,该行具有以外的空格(而不仅仅是带有任何'真实'字符的行)。包含非空白字符的行只是匹配正则表达式S的行(大写S的反斜杠表示非空白字符)。

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

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

话虽如此,请记住,留在后面的线是(我认为)从范围的第一个。所以,它不一定是空的,它可能包含空白。

如果您希望确保所有的空白行都为空,只需执行:

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

在上面的崩溃命令之后。或者,您可以使用|作为操作分隔符将这两个命令组合成一个命令:

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

最新更新