在vim中包装txt文件的单词未按预期工作

问题描述 投票:1回答:2

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

我按照这个blog的说明。我也在使用我在StackOverflow上阅读的内容。

首先,我在vim(命令模式)中执行了此操作:

:set textwidth=80

其次,我使用视觉模式v来选择文件中的所有行。我从第一行开始,按下G(进入最后一行)。这使得所有文件都被选中。

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

gq 

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

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

输出是:

90

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

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

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

我本周开始使用Vim。如果这个问题太天真,我很抱歉。

vim textwrapping
2个回答
1
投票

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

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

在你的示例文本中,我得到83的输出,因为包装在空白上的方式工作,计算为字符。为了解决这个问题,你可以使用类似:%s/\s*$//的方法修剪尾随空格,现在我使用strchars的上面的示例表达式按预期返回80。


0
投票

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

你真正想要的是使用:help virtcol()计算屏幕列。

© www.soinside.com 2019 - 2024. All rights reserved.