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

Regex 如何使用vim折叠多个空白行?,regex,vim,Regex,Vim,本封面详细介绍了以下vim命令如何将一系列空行折叠为一行: :g/^$/,/./-j 但是,我想做同样的事情,但也将其中只有白色空格的行视为空白。以下命令是我尝试的,但不起作用: :g/^\s*$/,/./-j 据我所知,这应该会找到空的行,并且只有空格,但不是所有的行都被折叠。你已经完成了一半 请记住,初始命令由搜索部分和操作部分组成。搜索部分:g/^$/找到了所有空行,并且为每个空行执行了操作部分,/./-j(好的,每个都没有被以前的j删除) 您对字符串的搜索部分所做的修改是正确的,因为

本封面详细介绍了以下
vim
命令如何将一系列空行折叠为一行:

:g/^$/,/./-j
但是,我想做同样的事情,但也将其中只有白色空格的行视为空白。以下命令是我尝试的,但不起作用:

:g/^\s*$/,/./-j
据我所知,这应该会找到空的行,并且只有空格,但不是所有的行都被折叠。

你已经完成了一半

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

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

然而,正是在那之后你正在执行的动作让你感到悲伤。要在找到的行上执行的原始操作是
,/./-j
,这基本上意味着在从此行到下一个“实”字符之前的行的范围内执行联接
j
。在您链接到的问题中,可以找到有关此工作原理的更多详细信息

它在您的案例中找到的第一个“真实”字符实际上包含空格,因此,虽然搜索位将查找空格行并对其执行操作,但操作中的连接范围将不是您想要的

您需要为操作中的范围结尾指定的是下一行之前的一行,该行不包含空格(而不仅仅是包含任何“实”字符的行)。带有非空白字符的行就是与regex
\S
匹配的行(带大写字母
S
的反斜杠表示非空白字符)

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

:g/^\s*$/,/\S/-j
话虽如此,请记住,留下的那条线(我认为)是距离射程的第一条线。所以,它不一定是空的,它可能包含空格

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

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

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

或者只是
:g/^\s*$/,/\s/-j
。很好,@Sato,这稍微简单一点。相应地调整了答案。