我知道有一些方法可以在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


将textwidth设置为80 (:Set textwidth=80),移动到文件的开头(可以使用Ctrl-Home或gg完成),并键入gqG。

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


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


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

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

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

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

:set textwidth=80
:set wrapmargin=2

(不要被换行和换行打断,它们只会重新格式化屏幕上显示的文本,并且不会改变缓冲区中的文本)


如果您正在寻找一种非vim的方式,总是可以使用UNIX命令fmt和par。

注:

我不能评论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选项没有重新格式化我的长文本行(我正在转换玩十六位字节转换):

: % !折叠-w 60

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


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