vim命令将文本重组/强制为80列


240

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

理想情况下,此命令将完全重组我选择的行,并在添加到短行的同时切掉长行。一个例子:

long line is long!  
short

运行命令后(假设自动换行为13列):

long line is  
long! short

如果用真正的vim命令无法做到这一点,也许有一个命令行程序可以将输入传递给我呢?

搜索后,我发现此参考书有更多选择:http : //www.cs.swarthmore.edu/help/vim/reformatting.html


9
您可能还想了解Vim可以将文本格式委派给外部程序,例如par。我做了一个截屏视频,演示了如何使用par格式化文本
纳尔斯特伦

@nelstrom谢谢,TIL关于par。这是梦幻般的!
史蒂文·卢

2
如果您想让文本看起来修长和修剪(剪裁得好吗?),请务必想到gq- 绅士季刊。(为男性拟人化道歉,但助记符有效。)
鲁芬

Answers:


372

设置textwidth为80(:set textwidth=80),移至文件的开头(可以使用Ctrl- Homegg),然后键入gqG

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


14
它也可以与视觉选择一起使用。即类似:V}gq。这样,您可以在实际格式化之前看到要格式化的内容。
Plouff 2014年

6
顺便说一句,它q本身到底是做什么的?
Richard-Degenne 2014年

1
有没有办法用只有一长串字符且没有空格的行来做到这一点?编辑:我发现了“折叠”实用程序。仍然想在vi中执行此操作。
唐纳德·史密斯

7
使用set tw=80而不是set textwidth=80节省时间
Yibo Yang

4
@dmranck输入后,行将自动换set textwidth=76行。我的抱怨是,它对正在编辑的现有行没有任何作用。但是V}gq在这方面非常有用。 V进入可视选择模式,}选择下一个段落中断,并gq在其上执行当前格式化程序(或用于gw显式调用vi格式化程序)。此外,{将向上选择。您可以选择整个文档和格式,ggVGgq尽管也许有更简单的方法。使用@可以将其另存为宏。用于显示vipgq当前段落。
ktbiz

94

迈克尔的解决方案是关键,但是我经常发现我想重新格式化本段的其余部分。为此,请使用gq}


17
对此进行扩展-您可以使用gq <motion>格式化所需的格式。
Dan Schnau 2013年

1
另外,“ nojoinspaces”选项可防止在句子边界处的行合并后出现两个空格。当您的印刷风格是英文句子之间的单个空格时,则很好。
Alex Hirzel 2014年

36

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

您也可以通过在可视模式下选择文本(使用`v和移动)然后键入gq来重新格式化。

还有其他一些强制行换行的选项。

如果您希望vim在将文本插入行时换行,而不必等到最后重新构造文本,则可以使用以下选项:

:set textwidth=80
:set wrapmargin=2

(不会被wrap和所跟踪linebreak,这只会重新格式化屏幕上显示的文本,并且不会更改缓冲区中的文本)


9
来自wrapmargin帮助:当'textwidth'不为零时,不使用此选项。
mmoya 2013年

21

多亏了DonaldSmith的评论,我发现了这一点,因为该textwidth选项并未重新格式化我的长行文本(我正在使用十六进制至字节转换进行转换):

:%!fold -w 60

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


1
很好 当将行分隔成单词时,所有答案都集中在限制行的宽度上。该解决方案适用于非常长的单词(DNA序列)。
pedrosaurio

1
对于长网址,这是我发现的唯一可行的方法。我已经很
熟悉

13

如果您正在寻找一种非Vim的方式,那么总会有UNIX命令fmtpar

笔记:

  • 我无法评论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。有关更多信息,请:help formatprg在Vim内部调用。


9

几乎我总是gq在可视模式下使用。我告诉我的学生,这是一本面向挑剔的人的杂志“先生们的季刊”。

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.