我知道有一些方法可以使用 set textwidth
(如 Vim 80 column layout concerns)在 vim 中自动设置文本的宽度。我正在寻找类似于 =
(缩进行命令)但要换行到 80 的内容。用例有时是您使用 textwidth 编辑文本,在加入行或删除/添加文本后,它会出现包装不佳的情况。
理想情况下,此命令将完全重新组织我选择的行,并在添加短行时切掉长行。一个例子:
long line is long!
short
运行命令后(假设换行是 13 列):
long line is
long! short
如果使用真正的 vim 命令无法做到这一点,那么也许有一个命令行程序可以执行此操作,我可以将输入传送到?
搜索后,我发现此参考有更多选项:http://www.cs.swarthmore.edu/help/vim/reformatting.html
par
。这是梦幻般的!
gq
-- Gentleman's Quarterly。 (为男性拟人化道歉,但助记符有效。)
将 textwidth
设置为 80 (:set textwidth=80
),移动到文件的开头(可以使用 Ctrl-Home 或 gg
完成),然后键入 { 4}。
gqG
格式化从当前位置开始到文件末尾的文本。如果可能,它将自动加入连续的行。如果您不想将这两行连接在一起,可以在两行之间放置一个空行。
Michael 的解决方案是关键,但我经常发现我想重新格式化当前段落的其余部分;对于此行为,请使用 gq}
。
您可以将 gq
与任何移动运算符一起使用。例如,如果您只想重新格式化到当前行的末尾(即换行光标所在的行),您可以使用 gq$
您还可以通过在可视模式下选择文本(使用 `v 和移动)然后输入 gq 来重新格式化。
还有其他选项可以强制换行。
如果您希望 vim 在您向其中插入文本时换行,而不是等到最后重新构造文本,您会发现这些选项很有用:
:set textwidth=80
:set wrapmargin=2
(不要被 wrap
和 linebreak
绕道,它们只会重新格式化屏幕上显示的文本,不会更改缓冲区中的文本)
wrapmargin
帮助:当 'textwidth' 不为零时,不使用此选项。
感谢 DonaldSmith 的评论,我发现了这一点,因为 textwidth
选项没有重新格式化我的长文本行(我正在使用十六进制到字节的转换进行转换):
:%!fold -w 60
这将整个文件(对我来说是一行)重新转换为长度为 60 的行。
如果您正在寻找一种非 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
。
我几乎总是在可视模式下使用 gq
。我告诉我的学生它代表“绅士季刊”,这是一本为挑剔的人准备的杂志。
不定期副业成功案例分享
V}gq
。通过这种方式,您可以在实际格式化之前看到要格式化的内容。q
本身到底是什么?set tw=80
而不是set textwidth=80
以节省时间set textwidth=76
之后,您的行将在键入时自动换行。我的抱怨是它对正在编辑的现有行没有任何作用。但是V}gq
在这方面非常有用。V
进入视觉选择模式,}
向下选择到下一个分节符,gq
在其上执行当前格式化程序(或使用gw
显式调用 vi 格式化程序)。此外,{
将向上选择。您可以使用ggVGgq
选择整个文档和格式,但也许有更简单的方法。使用@
将其保存为宏以使其更容易。使用vipgq
调出当前段落。