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

haf*_*aff 4 vim text line-breaks

是否可以在 Vim 中删除单个换行符但保留空行(我猜是双换行符?)?我正在使用 Vim 的 HardPencil 插件进行一些文字处理,我喜欢硬换行,因为它可以更轻松地在文件周围弹跳。但是,我需要在 LibreOffice Writer 或 Word 中共享此信息,如果其他人编辑文件,硬换行将无法正常工作。澄清一下,这就是我所拥有的:

Line1.
Line2.
Line3.

Line4.
Line5.
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

Line1. Line2. Line3.

Line4. Line5.
Run Code Online (Sandbox Code Playgroud)

基本上硬换行符应该用空格替换,双换行符应该保留。

我尝试了 的变体,:%s/\n但无法保留双换行符。我在这里这里发现了类似的问题,但这些不是 Vim 特有的。

Fab*_*tor 5

您可以line+line break用 just替换line,并使用负\(\n\)\@!向前瞻来确保它后面没有空行:

:%s/\(.\+\)\n\(\n\)\@!/\1 /
Run Code Online (Sandbox Code Playgroud)

@Peter_Rincker 的清洁解决方案:

:%s/.\+\zs\n\ze./ /
Run Code Online (Sandbox Code Playgroud)


Pet*_*ker 5

gw将(或gq) 与动作一起使用(如G)。

gwG
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)