Vim 如何动态设置textwidth以适应当前文件?

Vim 如何动态设置textwidth以适应当前文件?,vim,Vim,很长一段时间以来,我一直使用textwidth:80编写散文文本文件。出于各种原因,我想开始使用textwidth:72 如果我只是将.vimrc更改为使用72,我会遇到问题。要么我必须重新包装我接触到的任何旧文件(进行额外的校对和大型的、语义上无用的git提交),要么我在文件中得到72列的文本块,否则就是80列,这很难看 我想让vim在打开文件时计算出适当的文本宽度。类似于“使textwidth成为72列或此文件中的最大公共行长度,以较长者为准。”我包含“common”,因为我不希望一些过长的

很长一段时间以来,我一直使用textwidth:80编写散文文本文件。出于各种原因,我想开始使用textwidth:72

如果我只是将.vimrc更改为使用72,我会遇到问题。要么我必须重新包装我接触到的任何旧文件(进行额外的校对和大型的、语义上无用的git提交),要么我在文件中得到72列的文本块,否则就是80列,这很难看

我想让vim在打开文件时计算出适当的文本宽度。类似于“使textwidth成为72列或此文件中的最大公共行长度,以较长者为准。”我包含“common”,因为我不希望一些过长的行(可能是长URL)影响textwidth

我该怎么做?

获取长度 您可以通过以下方式获得当前缓冲区所有行的(升序)长度列表:

let lengths = sort(map(getline(1, '$'), 'strdisplaywidth(v:val)'), 'n')
然后,可能会删除最长的1%来解释任何异常值(或者在这里应用更详细的统计数据),并获得其余的最大值:

let max = max(lengths[0: (len(lengths) * 99 / 100)])
并使用它来检测在第80列换行的旧文件:

let isLegacyWidth = max > 72 && max <= 80
如果这些存储在特定位置:

假设已将上述长度检查放入
IsLegacyWidth()
函数中,则可以使用以下参数设置本地
'textwidth'
值:

let &l:textwidth = (IsLegacyWidth() ? 80 : 72)
了解长度 您可以通过以下方式获得当前缓冲区所有行的(升序)长度列表:

let lengths = sort(map(getline(1, '$'), 'strdisplaywidth(v:val)'), 'n')
然后,可能会删除最长的1%来解释任何异常值(或者在这里应用更详细的统计数据),并获得其余的最大值:

let max = max(lengths[0: (len(lengths) * 99 / 100)])
并使用它来检测在第80列换行的旧文件:

let isLegacyWidth = max > 72 && max <= 80
如果这些存储在特定位置:

假设已将上述长度检查放入
IsLegacyWidth()
函数中,则可以使用以下参数设置本地
'textwidth'
值:

let &l:textwidth = (IsLegacyWidth() ? 80 : 72)

要在打开文件时设置文本宽度,可以在
.vimrc
中包含如下自动命令:
autocmd BufNewFile,BufRead*.java set textwidth=72
。您可以使用
wc-L
获取文件的最大行长度。这并不能真正回答问题,但可能有点帮助。要在打开文件时设置文本宽度,可以在
中包含自动命令。vimrc
如下:
autocmd BufNewFile,BufRead*。java set textwidth=72
。您可以使用
wc-L
获取文件的最大行长度。这并不能真正回答问题,但可能会有一点帮助。