Динамический размер шрифта vim на основе длины файла

Я хочу, чтобы vim (MacVim) по умолчанию имел большой шрифт для новых/коротких файлов и динамически уменьшался до меньшего шрифта (до минимального набора) по мере роста числа строк. Возможно ли это с плагином? Какие концепции vim мне нужно знать, чтобы написать этот плагин?

Моя причина в том, что я люблю писать код в большом шрифте, но после того, как файлы будут длиннее, я скорее прищурился, чем прокрутка.

Ответы

Ответ 1

Это интересная идея. Не уверен, буду ли я использовать его:-) - но это, безусловно, интересная идея.

Вам не нужно писать полный плагин, так как все, что ему нужно сделать, это выполнить некоторую математику. Более конкретно, приблизительная формула:

enter image description here

Если требуемый размер (S) зависит от текущего номера документа строк (n), константа, определяющая, что считается большим файлом (k, в строках), желаемая амплитуда (a) - это означает, размер варьируется - и минимальный размер шрифта (м).

Теперь, когда мы это знаем, это просто вопрос его реализации. Быстрые примечания:

  • Чтобы получить 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. В противном случае у нас будет отрицательное число - плюс вычисление чего-то очевидного.
  • В четвертой строке мы построим строку, которая будет выполнена при заполнении формулы. Я выбираю hardcode значения для a и m здесь, так как они используются только один раз, и их легко модифицировать. Здесь a равно 5 и m равно 11, то есть шрифт будет варьироваться от 11 до 16. Синтаксис, который я использовал для установки шрифта, действителен для Mac. Если другой читатель использует другую систему, вы можете изменить ее соответствующим образом.

Поместите это в свой .vimrc или источник из другого файла, и вы будете готовы его протестировать. В файле с одной строкой шрифт равен 16. Если имеется 39 строк, а также размер 16, но размер 15, если их 40. Размер равен 14, когда имеется 80 строк и т.д.

Вероятно, вы хотите вызвать это автоматически, поэтому создайте также команду auto.

autocmd BufEnter * call DetermineFontSize()

Это будет работать только при вводе буфера, как сказано в названии. Вы можете изменить это, чтобы включить InsertLeave или что-то вроде этого, но имейте в виду, что это вызовет больше вызовов функции. Однако не должно быть проблем с производительностью.

Проверьте :h autocommand-events и постройте autocmd по своему усмотрению.


Update

Как указывал ZyX в комментариях, последняя строка из функции может быть записана как:

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

Ответ 2

vim выполняется в терминале. Размер шрифта зависит от терминалов, поэтому то, что вы просите, может быть невозможно, если только ваш vim не попросит терминал изменить размер шрифта... что может быть затруднено.