这里的问题和答案详细介绍了以下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/.*//