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

时间:2018-03-10 17:58:31

标签: vim

很长一段时间我都使用textwidth:80写了散文文本。我想开始使用textwidth:72,原因。

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

我希望vim在打开文件时找出合适的textwidth。类似于"使textwidth 72列或此文件中的最大公共行长度,以较长者为准。"我包括'普通'因为我不想要一些超长线 - 可能是长URL - 来影响文本宽度。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

获取长度

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

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

设置文本宽度

这可以通过:autocmd完成。这里最重要的问题是如何区分“散文文件”。如果您有自定义文件类型(例如text),则可以使用

autocmd FileType text ...

如果这些存储在某些位置:

autocmd BufReadPost /path/to/prose/* ...

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

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