我有一个相当大的文本文件,由类似这样的块组成
Short line.
Really long line.
Short line.
用空行分隔,我想使用 vim (在 Linux 上)来分解长行并获得如下块
Short line.
This was
part of
a long line.
Short line.
gq
我对(和)的问题gw
是,它将每个块重新排版为整个段落,即它不保留每个块内的两个换行符,并且根据的格式选项:help fo-table
,没有一个gq
选项允许我做我想做的事情。我还认为,如果我可以将换行符定义为段落分隔符,我就可以实现我的目标,但根据:help paragraph
这些是硬编码的。
编辑:我知道我可以使用gq
或gw
逐一格式化每一行,但由于我的文件超过几千行,所以我正在寻找一种自动实现此目的的方法。
答案1
:%norm! gww
这将把normal
命令gww
(将当前行格式化为gw
)应用于整个缓冲区,而不考虑自定义映射(以避免出现问题,例如gw
已映射到其他内容)。
看
:help :%
:help :norm
:help gww
此替代方案符合 Ben 在评论中的建议,比原始解决方案更直接,原始解决方案保存在下面,因为它可能更适合其他类似情况,因为它具有正则表达式匹配能力。但在“匹配所有行”的情况下,它没有必要那么粗暴。
以编程方式应用于gww
缓冲区中的每一行:
:g/^/norm gww
参见:help :g
.:help norm
匹配^
行的开头,这实际上使得此匹配每一个线。
你也可以选择只选择长度超过 60 个字符的行
:g/\%>60v/norm gww
(参见:help \%<
)但在实践中gww
只会重新格式化比textwidth
以前更长的行,因此对于速度和结果来说可能都不太重要。
(我使用v
“虚拟列”而不是c
“列”,因为后者实际上会计算行中的一定数量的字节。这在使用多字节编码时会导致意外结果,这通常是需要警惕的原因。实际上,由于与上述相同的原因,它不是一个真正的问题,因为它gww
不会重新格式化比textwidth
任何更短的行。)
答案2
gq
由于您已经阅读了和命令的手册gw
,我想您可能需要一些比手动移动到长行然后使用或另一个命令仅格式化当前行更方便gw0
的gw$
东西gw
。
我不知道在 Vim 中将长行拆分为文本块的简单方法。不过,既然您提到您在 GNU/Linux 系统上使用 Vim,我建议您通过 GNU 命令过滤文本fmt
。
对于整个文件:
:%!fmt --width=75 --split-only
对于当前段落(使用简短选项):
:'{,'}!fmt -75 -s
相关fmt
选项的解释为:
-w, --width=WIDTH
– 最大行宽(默认为 75 列)。该选项-WIDTH
是的缩写形式--width=DIGITS
(如果使用此缩写版本,则必须是第一个选项)。-s, --split-only
– 分割长行,但不重新填充;这是保留预先存在的硬换行符的选项。
答案3
从:
Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.
将标记放在“lorem ipsum”行上并按下gww
可得到(为了textwidth=40
清楚起见):
Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.
在我看来,这似乎就是您所要求的。如果不是,请随时澄清。
答案4
我认为这个工作是这样的:
:%s/\(\(\w\+\s\)\{1}\)/\r\1/g
然后,将 1 更改为您想要拆分的单词数。
会产生:
Short line.
Really
long line.
Short line.