我希望vim(MacVim)默认为新/短文件使用大字体,并随着行数的增加而动态缩小到较小字体(最小设置)。这可能与插件有关吗?编写该插件我需要了解哪些vim概念?

我想要这样做的原因是,我喜欢用大字体编写代码,但是在文件变长之后,我宁愿斜视而不是滚动。

最佳答案

那是一个有趣的想法。不知道我是否会使用它:-)-但这肯定是一个有趣的想法。

您不需要编写完整的插件,只需要做一些数学运算即可。更具体地说,一个粗略的公式是:



如果所需的大小(S)取决于当前文档的行数(n),则一个确定大文件的常数(以行为单位,k)取决于所需的幅度(a),即大小会变化多少,和最小字体大小(m)。

现在我们知道了,这只是实现它的问题。快速说明:


要获取n,我们可以调用line()函数,将"$"用作参数
要设置字体大小,在获得数字后,我们可以构建一个字符串并使用exec执行它


考虑到这一点,可以将快速描述的快速功能编写为:

function! DetermineFontSize()
    let bigFile = 200
    let nLines = line("$")
    let rate = (nLines > bigFile) ? 0 : (1-nLines/(bigFile*1.0))
    exec "set guifont=Menlo:h".float2nr(ceil((rate*5)+11))
endfunction


我确信其他Vim大师可以对此做出很大的改进。无论如何,简要说明:


设置我们所谓的大文件。我已选择200行用于调试目的,您可能需要更大的数量。
获取当前文件中的行数。
在上一个公式中加上括号。请注意,这是有条件的(如果您注意到我在公式中错过了,那就恭喜!)。如果行数超过最大常量,则返回0。否则,我们会有一个负数-加上明显的东西。
在第四行中,我们构建要在完成公式时执行的字符串。我选择在此处对a和m的值进行硬编码,因为它们仅使用一次,并且很容易修改。这里a是5,m是11,这意味着字体将在11到16之间变化。我在这里用来设置字体的语法对Mac有效。如果其他阅读器使用其他系统,则可能需要相应地进行更改。


将其放在您的.vimrc中或从其他文件中获取它,您就可以开始测试了。在一行文件中,字体设置为16。如果有39行,则大小也为16,但如果有40行,则大小为15。如果有80行,则大小为14,以此类推。

您可能想自动调用此命令,因此也要创建一个自动命令。

autocmd BufEnter * call DetermineFontSize()


顾名思义,这仅在您输入缓冲区时有效。您可以更改它以包含InsertLeave或类似内容,但是请记住,这将生成对该函数的更多调用。虽然应该不是性能问题。

检查:h autocommand-events并根据需要构建autocmd



更新资料

正如ZyX在评论中指出的那样,该函数的最后一行可以写为:

let &guifont='Menlo:h'.float2nr(ceil((rate*5)+11))

关于vim - 基于文件长度的动态vim字体大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6127845/

10-11 07:26
查看更多