如何打破vim中的长线?


12

我有一个很大的文本文件,由诸如

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这些字符,它们都是硬编码的。

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


顺便说一句:我在SU和网络上的vim文档中寻找解决问题的方法,结果空荡荡的。如果我忽略了明显的内容,我将很乐意删除此问题。
美联社


@MartinSchröder:很高兴知道这里有vi SE!但是,这些答案并未解决我的问题,因为我已经知道了gqgw。我也很高兴我没有在这里停下来,否则我不会了解该:g命令。:)
美联社

Answers:


16
:%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任何时间都短的行。)


显然:g:g//norm gww如果没有模式,它会失败,因此不会起作用,但是:g/.*/norm gww会起作用。
美联社

@AP:呵呵,为我工作。我正在使用Debian Unstable的Vim 7.4.488-6。
Daniel Andersson

4
:g//重用上一个搜索模式;如果没有,则失败。使用:g/^/适用于所有线路。
Ingo Karkat 2015年

@IngoKarkat:嗯,很有道理,因为我在测试中的最后一个模式是我稍后演示的可识别行长的模式。我将更新答案。您知道在帮助中提到“空模式”行为的地方吗?我无法轻易找到它。
Daniel Andersson

仔细阅读本手册,可能暗示:help last-pattern正常搜索中给出的信息也适用于该:global命令。
Daniel Andersson

4

既然你已经阅读过的手册gqgw命令,我想你可能想要的东西比手动移动到排长,然后使用更方便gw0gw$或其他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–分开长行,但不要重新装满;此选项可以保留您先前存在的硬换行符。


感谢您的提及fmt。不过,我更愿意接受其他答案,因为它只需要vim。
美联社

@AP不用担心。这是一个很好的答案,我本人已经接受了。它和您的问题都值得投票。
Anthony Geoghegan 2015年

1

从:

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.

在我看来,这就像您要的是什么。如果没有,请随时进行澄清。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.