在VIM中,如何将一条很长的线分成多行?


169

假设我在VIM编辑器中有一个超长行(大约300多个字符)。我如何将其分解为多行,以使单词边界大致以80个字符为界?

例:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...

Answers:


254

Vim做到这一点非常容易(在单词边界处换行)。

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

我建议你退房:help gq:help gw

另外,设置textwidth(tw)将使您在键入时超出时自动换行。也可以使用它gq,但是如果禁用则会gq中断窗口大小或79,具体取决于哪一个先出现。

:set tw=80

通过设置格式选项以包括文本宽度,vim将在tw设置处自动中断。

:set fo+=t

5
因此,对于您的情况,gq命令将是<ESC>(退出插入/替换/等模式),然后gq80l
MidnightLightning,2009年

6
这与Ctrl + j相反(将多行合并为一个)。
伊兹密尔·拉米雷斯

9
Vim从不停止让我惊奇。这是纯金。
2013年

10
仅对于下一个发现此问题的人,gq不会拆分一行纯文本,它需要空格来完成其工作
stringy05 2014年

2
[运行gqq] aaaahhh,它很漂亮
underscore_d

85

首先设置您的vim,以使其理解您需要80个字符:

:set tw=80

然后,照亮该行:

V

并重新格式化它:

gq


13

对于文本实线,在正常模式下使用v突出显示该区域,然后按

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

这将在第80个字符的末尾添加换行符。

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline

这是唯一适用于长base64字符串的解决方案。
jviotti

6

如果您使用* nix,则可能fold有空。

选择要使用的区域v,然后可以使用以下命令在宽度为80的空格处断开:

!fold --spaces --width=80

这本质上与使用相同gq

但是,如果您只想在第80个字符处中断而不限于空格,则可以使用:

!fold --width=80

如果您想一次击键就设置一个映射-我用过

vmap <f1> !fold --width=80<CR>


这是适用于不由空格分隔的长字符串的答案。在macOS上,您可能需要使用gfold而不是fold。
亚伦D

在Mac OS上,我必须做!fold -w 80
user674669


4

我需要重新格式化整个文件,而不是一行。正如Wernsey所指出的,我本可以使用'fmt',但是vim中的以下顺序也可以解决问题(从这里的各种答案中借用):

<ESC>
:setl tw=80 fo=t
1GVGgq

3

快速而讨厌,也许尝试以下地图:

map q 080lwbels<CR><ESC>

其中说:

  • 开始行的第0个位置,
  • 移到右边的第80个字符,
  • 转到下一个单词的开头,
  • 回到上一个词,
  • 转到当前单词的末尾
  • 向右转一个字符,然后
  • 用CR代替该字符。

然后按q和CR将把该行分成单词边界上的多个块。


0

我在最后一个空格之后但在80列之前,在每个LONGLINE中手动插入了“ \”(然后使用CR /制表符进行格式化)。也就是说:

1 this is a long, long, line

现在看起来像

1 this is a long, \
        long line

并正常编译。

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.