question and answers here详细介绍了以下vim
命令如何将一系列空行折叠为一行:
:g/^$/,/./-j
但是,我想要做同样的事情,但也要将只有白色空格的行视为空白。我尝试了以下命令,但它不起作用:
:g/^\s*$/,/./-j
据我所知,这应该找到空的行,并且只有空格,但并非所有行都被折叠。
答案 0 :(得分:1)
你已经到了一半。
请记住,初始命令由搜索部分和动作部分组成。搜索部分:g/^$/
找到了所有空行,并为每个行执行了行动部分,/./-j
(好的,每个尚未被之前的j
删除)。
您对字符串的搜索部分所做的修改是正确的,因为它现在会找到空行或只包含空格的行。
但是,你正在执行的动作会导致你的悲伤。在找到的行上执行的原始操作是,/./-j
,这基本上意味着在从该行到下一个“真实”字符之前的范围内执行连接j
。有关如何工作的更多细节可以在您链接的问题中找到。
它在您的情况下找到的第一个“真实”字符实际上包含空格,因此,当搜索位将找到空白行并对其进行操作时,操作中的连接范围将不会是你想要的。
你需要为动作范围的末尾指定的是下一行之前的行,其中包含 other 而不是空白(而不仅仅是具有任何'真实'字符的行)。具有非空白字符的行只是与正则表达式\S
匹配的行(带有大写S
的反斜杠表示非空白字符)。
所以,最后,你要找的是:
:g/^\s*$/,/\S/-j
话虽如此,请记住,留下的线是(我认为)第一个来自范围。所以,它不一定是空的,它可能包含空格。
如果您希望确保所有仅空白行都为空,请执行:
:g/^\s*$/s/.*//
在上面的折叠命令之后。或者,您可以使用|
作为操作分隔符将两者合并为一个命令:
:g/^\s*$/,/\S/-j|s/.*//