VIM - 将文本格式重新设置为一行段落



我有一个文本文件,如下所示:

--------
FOX&DOGS
The quick brown. Fox
jumped.
Over the lazy dogs.
-------------------

我想将其更改如下:

--------
FOX&DOGS
The quick brown. Fox jumped.
Over the lazy dogs.
-------------------

所以总的来说:

  • 保留空行
  • 在任何period_newline"."(段落末尾...在上面的例子中,我不想在"棕色"之后剪线。 例如:只有一个句点,但没有后跟换行符,所以它不是段落的结尾,所以它必须保持在同一行(

我的解决方案:

%s/nn/@r@r/ | %s/.n/.@r/ | %j | s/@ /r/g | $$d

这个想法有点粗鲁:

  • 标记段落的所有结尾和空行(我选择"@"作为标记(
  • 将所有行连接成一个长单行
  • 将标记"@">
  • (@ 后面有一个空格(替换为回车符"\r"(换行符(
  • 删除在此过程中创建的最后一个空行

它似乎有效,所以我还在 vimrc 中创建了一个别名:

command Par %s/nn/@r@r/ | %s/.n/.@r/ | %j | s/@ /r/g | $$d

问题: 如果没有任何空行,它将返回错误"找不到模式",并且不会更改任何内容。似乎需要一种条件指令(如果您发现模式将其替换为...否则不要停止,继续执行其他命令(。

有什么想法可以用简单的方式解决吗?

也许我找到了一个解决方案:

  • 在最后一个行之后添加一个空行,以便始终找到模式"">,即使它不存在于原始文件中,并且错误无法阻止下一个命令。

  • 最后,我们将不得不删除由替换"s/@/\r/g">创建的底部的 2 个空白行

所以我尝试的命令是:

$ | put _ | %s/nn/@r@r/ | %s/.n/.@r/ | %j | s/@ /r/g | $$d | $$d
  • $转到最后一行
  • 追加空行
  • 使用 @ 字符标记涉及空行(也添加最后一个空行(的换行符
  • 标记涉及句点
  • 的换行符(由于在上一步中添加了标记 @,最后一行不能以句点结尾(
  • 将所有行连接成一条长线
  • 用换行符替换标记"@">(这里我们在底部再创建两个空白行,必须删除(
  • 删除添加的最后两个空白行

局限性:

如果段落以"句点"以外的标点符号结尾,则根本不起作用。

欢迎任何改进我的原始单线的想法!

相关内容

  • 没有找到相关文章

最新更新