如何在vim中打破长行?

A.P*_*.P. 12 vim text-formatting

我有一个由块组成的相当大的文本文件,例如

Short line.
Really long line.
Short line.
Run Code Online (Sandbox Code Playgroud)

由空行分隔,我想使用 vim(在 Linux 上)来分解长行并获得像

Short line.
This was
part of
a long line.
Short line.
Run Code Online (Sandbox Code Playgroud)

我有问题gq(和gw)是它重排的每个块作为一整段,即不保持每个区块中的两个换行,并根据:help fo-table都没有gq的格式选项将允许我做我想做的。我还认为,如果我可以将换行符定义为段落分隔符,我就可以实现我的目标,但根据:help paragraph这些是硬编码的。

编辑:我知道我可以使用gqgw格式化每一长行,但由于我的文件运行超过几千行,我正在寻找一种自动实现这一目标的方法。

Dan*_*son 16

:%norm! gww
Run Code Online (Sandbox Code Playgroud)

这会在整个缓冲区上应用normal命令gww(将当前行格式化为 with gw),而不考虑自定义映射(以避免在例如gw已映射到其他内容时出现问题)。

  • :help :%
  • :help :norm
  • :help gww

这个替代方案是根据 Ben 在评论中的建议,并且比原始解决方案更直接,原始解决方案保存在下面,因为由于正则表达式匹配能力,它可能更适合其他类似情况。但是,在“匹配所有行”的情况下,它是不必要的。


应用gww在程序的缓冲区每一个人行:

:g/^/norm gww
Run Code Online (Sandbox Code Playgroud)

:help :g:help norm^匹配一行的开头,实际上这使得它匹配每一行。

也可以选择仅选择超过 60 个字符的行

:g/\%>60v/norm gww
Run Code Online (Sandbox Code Playgroud)

(请参阅:help \%<)但实际上gww只会重新格式化比其他textwidth任何时候都长的行,因此无论是速度还是结果都可能无关紧要。

(我使用的v是“虚拟列”而不是c“列”,因为后者确实计算了行中的一定数量的字节。这在使用多字节编码时可能会导致意外结果,这通常是需要警惕的原因。实际上,由于与上述相同的原因,这不是一个真正的问题,因为这gww不会重新格式化比textwidth任何情况下更短的行。)

  • `:g//` 重用最后一个搜索模式;如果没有,则失败。使用 `:g/^/` 应用于 _all_ 行。 (4认同)