动态vim字体大小基于文件长度

gou*_*uch 13 vim fonts font-size macvim

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

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

sid*_*yll 18

这是一个有趣的想法.不确定我是否使用它:-) - 但这肯定是一个有趣的想法.

您不需要编写完整的插件,因为它需要做的就是执行一些数学运算.更具体地说,粗略的公式是:

在此输入图像描述

如果所需的大小(S)取决于当前文档的行数(n),一个常数确定什么被认为是一个大文件(k,在行中),所需的幅度(a) - 意味着大小会有多大变化 -和最小字体大小(m).

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

  1. 为了获得n,我们可以将line()函数"$"作为参数调用
  2. 要设置字体大小,在我们有了数字后,我们可以构建一个字符串并执行它 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
Run Code Online (Sandbox Code Playgroud)

我相信其他Vim大师可以改善这一点.无论如何,快速解释:

  1. 设置我们称之为大文件的东西.为了调试目的,我已经完成了200行,你可能想要一个更大的数字.
  2. 获取当前文件中的行数.
  3. 在上一个公式中使用括号.请注意,有一个条件涉及(如果你注意到我在公式中错过了,恭喜!).如果我们有比最大常量更多的行,则返回0.否则,我们会有一个负数 - 加上计算一些显而易见的东西.
  4. 在第四行中,我们构建了在完成公式时要执行的字符串.我选择在这里硬编码am的值,因为它们只使用一次并且很容易修改它们.这里a是5,m是11,意味着字体在11到16之间变化.我在这里设置字体的语法对Mac有效.如果其他阅读器使用其他系统,您可能需要相应地更改它.

把它放在.vimrc中或从其他文件中获取它,你就可以测试了它.在一行文件中,字体设置为16.如果有39行,则大小为16,如果有40,则大小为15.如果有80行,则大小为14,依此类推.

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

autocmd BufEnter * call DetermineFontSize()
Run Code Online (Sandbox Code Playgroud)

只有当您输入缓冲区时,这才会起作用,如名称所示.您可以将其更改为包含InsertLeave或类似内容,但请记住,这将生成对函数的更多调用.但不应该是性能问题.

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


更新

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

let &guifont='Menlo:h'.float2nr(ceil((rate*5)+11))
Run Code Online (Sandbox Code Playgroud)