如何在Vim中将文本换行到指定长度?

115

让我们谈谈相对度量。我的 Vim 外观如下:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

我希望它更小一些:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

我该如何获得它?以及如何管理设置这样一个块的长度?


你是指换行文本,而不是缩进文本吗? - lc.
lc: 我不知道它们之间的区别。有人建议我写wrap,但我从未使其正常工作。 - Léo Léopold Hertz 준영
6个回答

204

你实际上可以做两件事情:

  1. 让vim通过插入换行符将你的文本格式化(即更改)为较短的行
  2. 保留行不变,但显示它们已换行

你想要哪一个?

选项1可以通过设置 textwidth (例如::set textwidth=30) 来实现。然后你可以通过突出显示文本(在可视模式下)并键入 gq 来重新格式化你的文本。(textwidth 可以缩写为 tw,因此也可以使用 :set tw=30 )。

选项2可以通过运行 :set wrap / :set nowrap 来切换。这将换行超出窗口长度的行。

两个选项是独立的。


41
从可视模式下使用 gq 键命令加一,非常实用。 - Fire Crow
3
请注意,该命令在空格处断行,而且即使使用tw=5,gqgq命令也无法对问题中所示的行进行任何操作。 - dlamblin
2
@Dlamblin:正确。如果您想在确切给定的宽度处折叠,而不考虑空格,则可以使用 fold 命令,就像 fgm 的回答中一样。 - sleske
如何在不改变终端大小的情况下设置vim窗口边界? - theonlygusti
又是一堂Vim学习课!我设置了formatprg=fmt\ -70\ -s,而不是设置tw,并在可视模式下使用gq,效果非常完美!现在我可以格式化那些Git提交信息了。别忘了在formatprg中转义空格。 - ikwyl6
显示剩余2条评论

72

一旦您设置了'textwidth',您可以使用可视模式选择文本,并按gq进行美观的换行(在某些旧版/传统配置中也可以使用Q)。

一些有用的提示:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq

4
+1,我在使用vim时不小心按了gq键,花了半个小时来弄清楚我所按的是什么。这真是太有用了。 - user176121
gqq 包裹当前行(而不是 gqgqgq$)。 - ash
这是唯一一个对我有效的答案,当你有需要换行的现有文本时。其他答案设置了配置而不是强制换行现有文本。 - Dennis
参见gw。我通常更喜欢使用gw,因为它在格式化后将光标保持在原位(参见:h gw)。我习惯性地键入gwip来格式化当前正在编辑的段落,而不移动光标。 - postylem

25

使用 fold(1) 是一种可能的方法:

:%!fold -w5 

结果:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc

1
这也不尊重折叠的空格。 - Lionel
7
@Lionel: 是的。为了保留空格,请在fold命令中加入选项“-s”。 - sleske

14
:set textwidth=30

当没有空格时,textwidth如何处理,例如原帖作者的示例?我已经尝试过了,它似乎只会根据textwidth进行格式化,如果有空格(或者假设breakat变量设置为其他内容),它才会进行格式化。 - Andy
4
@Andy 的 textwidth 无法处理没有空格的情况。您可以编写自己的 formatexpr 函数来解决这个问题。 - Swaroop C H

8

如果您有没有空格的文本想要在一定长度处换行,既不必使用外部的 fold 命令,也不需要编写自己的 formatexpr 函数。

:%s/\(.\{80\}\)/\1\r/g

将会在 80 个字符处断开所有行。


2
这个在我恢复 OpenSSL 证书时救了我的一天。谢谢。 - Cengiz Can

1
首先,使用以下代码将文本宽度设置为5:

textwidth=5

:set tw=5

然后,按下gqap来格式化一个段落。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接