Vim命令重组/强制文本到80列

我知道有一些方法可以在vim中使用set textwidth(如Vim 80列布局问题)自动设置文本的宽度。我正在寻找的是类似=(缩进行命令)的东西,但要包装到80。用例是有时你用textwidth编辑文本,在加入行或删除/添加文本后,它出来的包装很差。

理想情况下,这个命令将完全重新组织我选择的行,并删除长行,同时添加短行。一个例子:

long line is long!
short

运行命令后(假设wrap是13 cols):

long line is
long! short

如果这是不可能与一个真正的vim命令,也许有一个命令行程序,这是我可以管道输入?

经过搜索,我找到了这个引用,它有更多的选项:http://www.cs.swarthmore.edu/help/vim/reformatting.html

113509 次浏览

textwidth设置为80 (:set textwidth=80),移动到文件的开头(可以使用Ctrl-首页gg),并键入gqG

gqG从当前位置开始格式化文本,一直格式化到文件的末尾。它将在可能的情况下自动连接连续的行。如果你不希望这两行连在一起,你可以在两行之间放一个空行。

Michael的解决方案是关键,但我经常发现我想重新格式化其余的 当前段落;对于这种行为,使用gq}.

可以将gq与任何移动操作符一起使用。例如,如果你只想重新格式化到当前行的末尾(即换行光标所在的行),你可以使用gq$

您还可以通过在可视模式下选择文本(使用' v并移动)然后输入gq来重新格式化。

还有其他选项可以强制换行。

如果你想要vim包装你的行,而你正在插入文本,而不是等到最后重组文本,你会发现这些选项很有用:

:set textwidth=80
:set wrapmargin=2

(不要被wraplinebreak偏离轨道,它们只会重新格式化屏幕上显示的文本,而不会改变缓冲区中的文本)

如果你正在寻找一个non-Vim方式,总是有UNIX命令fmt票面价值

注:

  • 我不能评论Unicode,它的行为可能不同,也可能不同。
  • @nelstrom已经在他的网络广播中提到了使用par

下面是我们如何使用这两个例子。

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

在Vim内部使用:

:%! fmt -w 13
:%! par 13gr

你也可以将:formatprg设置为par或fmt并覆盖gq。有关更多信息,请在Vim中调用:help formatprg

感谢DonaldSmith的评论,我发现了这一点,因为textwidth选项没有重新格式化我的长文本行(我正在转换玩十六进制字节转换):

:%!fold -w 60

这将整个文件(对我来说是一行)重新格式化为长度为60的行。

我几乎总是在可视模式下使用gq。我告诉我的学生,它代表的是《绅士季刊》(gentlemen’Quarterly),一本专为挑剔的人准备的杂志。