vim 中的 txt 文件换行未按预期工作

Word wrapping a txt file in vim not working as expected

我正在尝试编辑 vim 上的文件。您可以下载txt文件here.

我正在按照此 blog 上的说明进行操作。我也在使用我在 Whosebug 上阅读的内容。

首先,我在vim(命令模式)中做了这个:

:set textwidth=80

其次,我使用视觉模式 v 来 select 文件中的所有行。我从第一行开始,然后按下 G(转到最后一行)。这使得所有文件 selected.

第三,为了重新格式化,我做了:

gq 

好的,文字接近我想要的。但是,当我这样做时:

:echo max(map(range(1, line('$')), "col([v:val, '$'])")) - 1

输出为:

90

上面的命令显示了最长行的字符长度。输出应该是 80,而不是 90!

我设置的文字换行限制是:80

我犯了什么错误?如何将文本换行到 80 列?

这周我开始使用 Vim。如果这个问题太幼稚,我很抱歉。

您的文本宽度和重新格式化工作正常,但表达式 col 实际上是在计算每行末尾的列位置(不是字符位置)的 "byte index"。有关 col 工作原理的所有信息,请参阅 :help col

相反,请尝试使用像 strchars 这样的字符计数函数: echo max(map(range(1, line('$')), "strchars(getline(v:val))"))

在您的示例文本中,我得到了 83 的输出,这是因为换行在计算为字符的空白处的工作方式。为了解决这个问题,您可以 trim 尾随空格,例如 :%s/\s*$//,现在我上面的示例表达式按预期使用 strchars returns 80。

:help col() 为您提供列的字节索引。如果您只有 ca 这样的单字节字符,但您的文本包含很多字符,例如 ç (U+00e7) or á (U+00e3) ,这将按预期工作,这些字符用超过一个字节,因此很多行的计数都将关闭。

您真正想要的是计算屏幕列数,:help virtcol()