¿Cómo obtengo la altura y el ancho reales de Vim?


18

winheight()y winwidth()devuelve el número de columnas / líneas en la ventana actual. Lo que estoy buscando es algo más cercano a la altura y el ancho reales del área de edición, o al área mostrada si se ejecuta en una terminal. El problema con winheight()y winwidth()es que la relación de aspecto calculada a partir de estos valores está fuera de contacto con la relación de aspecto real.

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

Una captura de pantalla del área del búfer tiene un tamaño de 936x918 píxeles, con una relación de aspecto visualizada de 1.019608. Creo que puedo obtener el valor real usando el tamaño de la fuente, pero ¿cómo?

Este es un seguimiento de ¿Cómo puedo hacer que Vim abra la ayuda en una división vertical? . Estoy tratando de adaptar la solución de Nobe4 .


3
No creo que pueda obtener dimensiones en píxeles con funciones simples de Vim. En cuanto a la ayuda abertura en una división vertical, no me molesto con los cálculos de la relación de aspecto, acabo de dividir verticalmente si la ventana de terminal es lo suficientemente amplia como: cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>.
Sato Katsura

1
@SatoKatsura sigue la tradición establecida por la mayoría de los desarrolladores web, que utilizan el ancho del documento para determinar si es un dispositivo móvil. :(
muru

1
En realidad no, ya que solo me estoy infligiendo eso a mí mismo. Jugué con la relación de aspecto durante un tiempo y encontré que los resultados no eran satisfactorios. Entonces recordé que tengo exactamente dos atajos para abrir terminales, para tamaño "normal" y para terminales "anchos". Entonces mis terminales casi siempre tienen los mismos tamaños. YMMV por supuesto.
Sato Katsura

@SatoKatsura ese comando es algo de magia oscura seria. Estoy muy sorprendido de que, aparte de no saber sobre el ==#operador que :hayudó a aclarar, realmente entendí todo el maldito comando. ¿Eso me convierte en un experto de Vim? Tiene que ser algo así. Necesito salir más.
Steven Lu

Respuestas:


1

104 columnas / 51 líneas = 2.04

Su cálculo está sesgado porque la relación de aspecto de cada celda es vertical.

Por ejemplo, en Terminal.app, con fuente de 23 puntos y espaciado de caracteres predeterminado, cada celda de terminal tiene un ancho de 7 píxeles y una altura de 15 píxeles para un total de 728 x 765 píxeles :

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


No puede recuperar el tamaño de fuente desde Vim sin invocar comandos externos o una forma de comunicarse con el terminal, lo que puede llegar a ser bastante pesado. Obviamente, esto es diferente en Gvim gracias a 'guifont'.

Si logra hacerlo, aún necesita una forma de deducir el tamaño de una celda que puede variar según el programa del terminal si no hay un estándar . Solo revisé iTerm 2, que afortunadamente tiene el mismo resultado.


Por lo tanto, optaría por una solución estática. Injerté la verificación de ancho mínimo en este fragmento que podría colocar en 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>)

Si la ventana es lo suficientemente grande como para mantener 80 columnas del búfer actual, se abre una división de ayuda estrecha a la derecha, de lo contrario, la división se abre a continuación. Puede personalizar la dirección dividida con :vertical.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.