在Vim中,如何将一个很长的行拆分为多个行?

假设我在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 ...
84947 次浏览

作为一个快速和肮脏的,也许可以尝试下面的地图:

map q 080lwbels<CR><ESC>

上面写着:

  • 开始行的第0个位置,
  • 向右移动到第80个字符,
  • 转到下一个单词的开头,
  • 返回上一个单词,
  • 转到当前单词的结尾,
  • 向右一格,然后
  • 用Cr替换该字符。

然后,点击Q和Cr将在单词边界上将行分解为块。

这实际上与Vim无关,但您可以使用FMT程序,如

$ fmt myfile

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

此外,设置文本宽度(tw)将在输入过程中超出时自动换行。它也在gq中使用,但如果禁用_ABC,则_1会根据窗口大小或79中断,具体取决于哪个先出现。

:set tw=80

通过将格式选项设置为包括文本宽度,Vim将在TW设置处自动中断。

:set fo+=t

首先设置你的Vim,让它知道你想要80个字符:

:set tw=80

然后,点亮这条线:

V

并使Vim重新格式化它:

gq

我需要重新格式化整个文件,而不是一行。正如Wernsey所指出的,我本来可以使用' FMT ',但Vim中的以下序列也起到了作用(借用这里的各种答案):

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

如果您在*nix上,您可能有fold可用。

使用v选择所需的区域,然后可以使用以下命令在宽度为80的空格上换行:

!fold --spaces --width=80

这在本质上与使用gq相同。

但是,如果您只想在字符80处中断,并且不受空格的限制,则可以使用:

!fold --width=80

如果你想要一个按键,只需设置一个映射-我已经使用

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

要在完整文档中拆分长行而不删除已存在的换行符,请使用:

:set formatoptions+=w
:set tw=80
gggqG

对于文本的实线,在正常模式下使用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

我在最后一个空格之后但在80列之前的每个长行中手动插入了“\”(然后是Cr/TAB格式)。也就是说:

1 this is a long, long, line

现在看起来

1 this is a long, \
long line

并正常编译。

FMT在Vim中也能很好地工作,并将改变如下内容:

MD5:a55b4eeb6fc24b2377a31a37c490d236|SHA1:bb4e344c5f271bf8b76b3fdc626a26627e97f453|SHA256:7a386adbbf9ce26e892f044128f21c70b13695ce7931456c12868776bc680582|SHA512:decb7b5b66fa5a272fdab56cd4

到一个更有利的 哈希:

|

它将把哈希类型、哈希数和管道都依次放在各自的行上……

只需直观地选择所需的文本,然后:

!FMT-1

我在一个地方手动打破了长队。我认为重点是按“ R ”键。(正常模式)然后按。

这将删除光标所在的字符。所以记住在你想要换行的单词前的空格处这样做,否则你将不得不插入缺少的字符。

我只是不知道如何打破这条线,并将其向下移动2行空间,以便在两条线之间有空间。

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

_,ABC_0发布了一个非常非常有用的食谱!

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

它可以通过将。{80}替换为不同的模式来断开任何模式的行。例如,在一词出现的所有地方,用换行符替换以下空格:

:s/\v(line)[ ]*/\1/r/g

将分隔符移动到\1之前或之后的\r位置。

 :s/\v(This)/\r\1/g

省略“ 1 ”如果您想用换行符替换图案,无论有没有其他内容:

 :s/\v(long line )/short line\r/g

由于这是S///替换,因此它对:G/选择/S/查找/代替/G非常有用,其中选择是选择要编辑的行的模式,查找是要在此处断行的模式,而代替是实际的断行。

:g/^This.*This/s/\v(This)/\1\r/g

说真的,答案很棒。