Как мне узнать фактическую высоту и ширину Vim?

18

winheight()и winwidth()вернуть количество столбцов / строк в текущем окне. То, что я ищу, - это что-то ближе к реальной высоте и ширине области редактирования или отображаемой области, если выполняется в терминале. Проблема с winheight()и в winwidth()том , что соотношение сторон рассчитаны из этих значений вне связи с фактическим соотношением сторон.

:echo winwidth('%') winheight('%') winwidth('%') * 1.0 / winheight('%')
104 51 2.039216

Снимок экрана области буфера имеет размер 936x918 пикселей, что дает отображаемое соотношение сторон 1.019608. Я думаю, что я могу получить фактическое значение, используя размер шрифта, но как?

Это продолжение того, как я могу сделать Vim открытой справкой в ​​вертикальном разделении? , Я пытаюсь адаптировать решение Nobe4 .

Мур
источник
3
Я не думаю, что вы можете получить размеры в пикселях с помощью простых функций Vim. Что же касается открытия помощи в вертикальном расколе, я не беспокоить с соотношением сторон вычислений, я просто разделить вертикально , если окно терминала достаточно широко: cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>.
Сато Кацура
1
@SatoKatsura, таким образом, следуя традиции, установленной большинством веб-разработчиков, которые используют ширину документа, чтобы определить, является ли он мобильным. :(
Муру
1
Не совсем, так как я только причиняю это себе. Некоторое время я играл с соотношением сторон и нашел результаты неудовлетворительными. Тогда я вспомнил, что у меня есть ровно два ярлыка для открытия клемм, для «нормального» размера и для «широких» клемм. Так что мои терминалы почти всегда имеют одинаковые размеры. YMMV конечно.
Сато Кацура
@SatoKatsura эта команда - серьезная темная магия. Я очень удивлен, что помимо того, что я не знал об ==#операторе, который :hпомог мне разобраться, я на самом деле понимал всю эту команду. Это делает меня экспертом по Vim? Должно быть что-то в этом роде. Нужно больше убираться.
Стивен Лу

Ответы:

1

104 столбца / 51 строка = 2,04

Ваш расчет искажен, потому что соотношение сторон каждой ячейки вертикальное.

Например, в Terminal.app с шрифтом 23pt и межсимвольным интервалом по умолчанию каждая ячейка терминала имеет ширину 7px и высоту 15px, что в общей сложности составляет 728x765px :

(104 * 7) / (51 * 15) = 728/765 = 0,95


Вы не можете получить размер шрифта из Vim, не вызывая внешние команды или способ связи с терминалом, который может стать довольно тяжелым. Очевидно, что это отличается от Gvim благодаря 'guifont'.

Если вам удастся сделать это, вам все равно нужен способ вычесть размер ячейки, который может варьироваться в зависимости от программы терминала, если нет стандарта . Я только проверил iTerm 2, который, к счастью, имеет тот же результат.


Поэтому я бы выбрал статическое решение. Я привел проверку минимальной ширины к этому фрагменту, который вы можете поместить в plugin/help.vim:

function! Help(...)
  let l:topic = a:0 ? a:1 : ''
  if winwidth('%') >= 160 " Minimum width
    execute 'vertical botright help' l:topic
    execute 'vertical resize 78'
  else
    execute 'botright help' l:topic
  endif
endfunction

" Use :H to open a vertical or horizontal help split
command! -complete=help -nargs=? H call Help(<f-args>)

Если окно достаточно велико, чтобы сохранить 80 столбцов текущего буфера, справа открывается узкое разделение справки, в противном случае разделение открывается ниже. Вы можете настроить направление разделения с помощью :vertical.

LEI
источник