Comment obtenir la hauteur et la largeur réelles de Vim?

18

winheight()et winwidth()retourner le nombre de colonnes / lignes dans la fenêtre courante. Ce que je recherche, c'est quelque chose de plus proche de la hauteur et de la largeur réelles de la zone d'édition, ou de la zone affichée si elle est exécutée dans un terminal. Le problème avec winheight()et winwidth()est que le rapport d'aspect calculé à partir de ces valeurs est déconnecté du rapport d'aspect réel.

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

Une capture d'écran de la zone tampon a une taille de 936x918 pixels, ce qui donne un rapport hauteur / largeur affiché de 1.019608. Je pense que je peux obtenir la valeur réelle en utilisant la taille de la police, mais comment?

Ceci est un suivi de Comment puis-je faire pour ouvrir l'aide Vim dans une division verticale? . J'essaie d'adapter la solution de Nobe4 .

muru
la source
3
Je ne pense pas que vous puissiez obtenir des dimensions en pixels avec de simples fonctions Vim. En ce qui concerne l' aide d'ouverture dans une division verticale, je ne prends pas la peine avec des calculs de ratio d'aspect, je fendus verticalement si la fenêtre du terminal est assez large: cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>.
Sato Katsura
1
@SatoKatsura suit ainsi la tradition établie par la plupart des développeurs Web, qui utilisent la largeur du document pour déterminer s'il s'agit d'un mobile. :(
muru
1
Pas vraiment, puisque je ne m'inflige que ça. J'ai joué avec les proportions pendant un moment et j'ai trouvé les résultats insatisfaisants. Ensuite, je me suis souvenu que j'avais exactement deux raccourcis pour ouvrir les terminaux, pour la taille "normale" et pour les terminaux "larges". Mes terminaux ont donc presque toujours les mêmes tailles. YMMV bien sûr.
Sato Katsura
@SatoKatsura cette commande est de la magie noire sérieuse. Je suis très surpris qu'en plus de ne pas connaître l' ==#opérateur qui a :haidé à éclaircir, j'ai en fait compris toute la commande. Cela fait-il de moi un expert Vim? Ça doit être quelque chose comme ça. Besoin de sortir plus.
Steven Lu

Réponses:

1

104 colonnes / 51 lignes = 2,04

Votre calcul est biaisé car le rapport hauteur / largeur de chaque cellule est vertical.

Par exemple, sur Terminal.app, avec une police de 23 pt et un espacement des caractères par défaut, chaque cellule du terminal a une largeur de 7 pixels et une hauteur de 15 pixels pour un total de 728 x 765 pixels :

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


Vous ne pouvez pas récupérer la taille de police à partir de Vim sans invoquer des commandes externes ou un moyen de communiquer avec le terminal, ce qui peut devenir assez lourd. Évidemment, c'est différent dans Gvim grâce à 'guifont'.

Si vous parvenez à le faire, vous avez toujours besoin d'un moyen de déduire la taille d'une cellule qui peut varier en fonction du programme du terminal s'il n'y a pas de norme . J'ai seulement vérifié iTerm 2 qui a heureusement le même résultat.


J'opterais donc pour une solution statique. J'ai greffé la vérification de la largeur minimale sur cet extrait dans lequel vous pouvez placer 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 fenêtre est suffisamment grande pour conserver 80 colonnes du tampon actuel, un fractionnement d'aide étroit est ouvert sur la droite, sinon le fractionnement est ouvert ci-dessous. Vous pouvez personnaliser la direction de division avec :vertical.

LEI
la source