删除单行换行符但使用Vim保留空行

删除单行换行符但使用Vim保留空行

问题描述:

在Vim中删除单行换行符但保留空行(我猜想是双行换行符)吗?我使用Vim的HardPencil插件来做一些文字处理,并且我喜欢硬线断裂,因为它可以让文件更容易反弹。但是,我需要在LibreOffice Writer或Word中分享这些信息,如果其他人编辑文件,强行换行不会很好。为了澄清,这是我有:删除单行换行符但使用Vim保留空行

Line1. 
Line2. 
Line3. 

Line4. 
Line5. 

这是我想什么:

Line1. Line2. Line3. 

Line4. Line5. 

本质硬换行都应该用空格代替,并且双换行符应予以保留。

我试过:%s/\n的变体,但不能得到保留的双行换行符。我发现了类似的问题herehere,但这些不是Vim特定的。

你可以只用line取代line+line break,并使用负前瞻\(\n\)\@!,以确保它不跟一个空行:

:%s/\(.\+\)\n\(\n\)\@!/\1/

@ Peter_Rincker的清洁解决方案:

:%s/.\+\zs\n\ze.//
+0

我觉得这是非常接近。 '1号线。 2号线。 Line3“都适合出现在同一行上,就像'Line4'一样。 Line5.',但两者之间的空白行已被折叠。 – haff

+0

随后,我想我可以在每次换行后添加一个空行。 – haff

+0

@haff,我错过了。我猜你可以在这里使用负面观察,但正则表达式有点复杂 – Fabricator

使用gw (或gq)与运动(如G)。

gwG 

gw是Vim的段落格式算子“回流”文本到所需'textwidth'。您可能需要暂时将'textwidth'设置为0以获取无限文字宽度(:set tw=0)。

还有一些其他方面也做到这一点还有:

  • 使用:%!fmt - 同样的想法上面一样,但使用fmt外部工具和过滤器。
  • :v/^$/,//-j - 将非空行挤在一起。如果范围的末尾没有空行,则失败
  • :g/\v(.+\zs\n)+/,-//j - 同时挤压非空行,但避免前一方法的范围错误。
  • 替代 - 见@Fabricator解决方案为例

如需更多帮助,请参见:

:h gw 
:h operator 
:h 'tw' 
:h filter 
:h :range! 
:h :range 
:h :v 
:h :j 
:h :g 
:h magic 
:h /\zs