如何在Vim中将文本包装到一定长度?


102

让我们说说相对的措施。我的Vim看起来像:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

我希望它更小:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

我怎么才能得到它?以及如何管理这样一个块的长度?


您是指换行而不是缩进吗?
lc。

lc:我不知道区别。我打算按照我的建议写包装纸,但是我从来没有做过。
莱奥波德·赫兹(LéoLéopoldHertz),2009年

Answers:


177

您实际上可以做两件事:

  1. 通过插入换行符,让vim格式化(即更改)文本以使其行更短
  2. 保留原样,但显示为换行

你要哪个?

选项1将通过设置来实现textwidth(例如:set textwidth=30(根据Swaarop的回答))。然后,您可以通过突出显示文本(在可视模式下)并输入来重新格式化文本gq。(textwidth可缩写为tw,从而:set tw=30。)

可以通过运行:set wrap/ 来切换选项2 :set nowrap。这将包裹对于窗口而言太长的行。

两者都是独立的。


33
视觉模式下的gq键命令+1,这非常有用
Fire Crow,

3
仅供参考,这会中断空格,即使tw = 5,gqgq也不会对问题中显示的行做任何操作。
dlamblin 2011年

2
@Dlamblin:正确。如果您想完全按照给定的宽度折叠,而不考虑空格,那么请fold按照fgm的答案使用命令。
sleske 2011年

据我所知,您对的选择无效。wrap将包裹在窗口边界处,而不是处textwidth
DerWeh

@DerWeh:是的,自动换行将在窗口边界自动换行。我编辑来澄清。
sleske

60

设置“文本宽度”后,您可以在可视模式下选择文本,然后按gq进行自动换行(也可以在某些较旧的/旧式配置中使用Q)。

一些有用的提示:

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

3
+1,我在vim时不小心碰到了gq,花了最后一个半小时试图查看我被打到了什么。这很有用。
user176121

gqq还会包装当前行(而不是gqgqgq$)。
Ash Ash

21

使用fold(1)是一种可能性:

:%!fold -w5 

结果:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc

1
这也不符合折叠空间的要求
Lionel 2010年

7
@Lionel:是的。要注意空格,请在折叠命令中添加选项“ -s”。
sleske,2011年

14
:set textwidth=30

在没有空格的情况下(如原始海报的示例),textwidth如何处理?我玩过一次,而且似乎只有在有空格的情况下才根据textwidth设置格式(或者假设,如果breakat变量设置为其他值)。
安迪2009年

3
@Andy textwidth不会处理无空格的情况。您可以编写自己的formatexpr函数来做到这一点。
Swaroop CH,2009年

8

如果您的文本没有空格,并且希望以一定的长度来打断,那么既不必使用external fold也不用自己编写formatexpr

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

将以80个字符断开所有行。


2
这节省了我的时间,同时恢复了OpenSSL证书。谢谢
Cengiz Can
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.