Como obtenho a altura e largura reais do Vim?

18

winheight()e winwidth()retorne o número de colunas / linhas na janela atual. O que estou procurando é algo mais próximo da altura e largura reais da área de edição ou da área exibida, se executada em um terminal. O problema com winheight()e winwidth()é que a proporção calculada a partir desses valores está fora de sintonia com a proporção real.

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

Uma captura de tela da área do buffer tem o tamanho de 936x918 pixels, fornecendo uma proporção de 1.019608. Acho que posso obter o valor real usando o tamanho da fonte, mas como?

Este é um acompanhamento de Como posso fazer com que o Vim abra a ajuda em uma divisão vertical? . Estou tentando adaptar a solução do Nobe4 .

muru
fonte
3
Eu não acho que você pode obter dimensões em pixels com funções simples do Vim. Quanto a ajuda abertura numa divisão vertical, que não se preocupam com o cálculo da razão de aspecto, que apenas dividir verticalmente se a janela do terminal é suficientemente larga: cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>.
Sato Katsura
1
O @SatoKatsura segue a tradição estabelecida pela maioria dos desenvolvedores da Web, que usam a largura do documento para determinar se é um dispositivo móvel. :(
muru
1
Na verdade não, já que estou apenas infligindo isso a mim mesma. Joguei com a proporção por um tempo e achei os resultados insatisfatórios. Lembrei-me de que tinha exatamente dois atalhos para abrir terminais, para tamanho "normal" e para terminais "largos". Portanto, meus terminais quase sempre têm os mesmos tamanhos. YMMV é claro.
Sato Katsura
@SatoKatsura esse comando é uma mágica sombria séria. Estou muito surpreso que, além de não saber sobre o ==#operador que :hajudou a esclarecer, eu realmente entendi todo o maldito comando. Isso faz de mim um especialista em Vim? Tem que ser algo assim. Precisa sair mais.
Steven Lu

Respostas:

1

104 colunas / 51 linhas = 2,04

Seu cálculo é inclinado porque a proporção de cada célula é vertical.

Por exemplo, no Terminal.app, com fonte de 23 pontos e espaçamento de caracteres padrão, cada célula do terminal tem uma largura de 7 px e uma altura de 15 px para um total de 728 x 765 px :

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


Você não pode recuperar o tamanho da fonte no Vim sem chamar comandos externos ou uma maneira de se comunicar com o terminal, que pode se tornar bastante pesado. Obviamente, isso é diferente no Gvim graças a 'guifont'.

Se você conseguir fazer isso, ainda precisará deduzir o tamanho de uma célula, que pode variar dependendo do programa do terminal, se não houver um padrão . Eu verifiquei apenas o iTerm 2, que felizmente tem o mesmo resultado.


Portanto, eu optaria por uma solução estática. Enxaguei a verificação de largura mínima nesse trecho em que você pode colocar 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>)

Se a janela for grande o suficiente para manter 80 colunas do buffer atual, uma divisão estreita de ajuda será aberta à direita, caso contrário, a divisão será aberta abaixo. Você pode personalizar a direção da divisão com :vertical.

LEI
fonte