Come posso ottenere l'altezza e la larghezza effettive di Vim?


18

winheight()e winwidth()restituisce il numero di colonne / righe nella finestra corrente. Quello che sto cercando è qualcosa di più vicino all'altezza e alla larghezza effettive dell'area di modifica o all'area visualizzata se eseguita in un terminale. Il problema con winheight()e winwidth()è che le proporzioni calcolate da questi valori non sono in contatto con le proporzioni effettive.

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

Uno screenshot dell'area buffer ha dimensioni di 936x918 pixel, con una proporzione visualizzata di 1.019608. Penso di poter ottenere il valore effettivo utilizzando la dimensione del carattere, ma come?

Questo è il seguito di Come posso fare in modo che Vim apra aiuto in una divisione verticale? . Sto cercando di adattare la soluzione di Nobe4 .


3
Non penso che puoi ottenere dimensioni in pixel con semplici funzioni di Vim. Come aiuto apertura in una divisione verticale, non si preoccupano con calcoli proporzioni, Ho diviso verticalmente se la finestra terminale è sufficientemente larga: cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>.
Sato Katsura,

1
@SatoKatsura segue quindi la tradizione stabilita dalla maggior parte degli sviluppatori Web, che utilizzano la larghezza del documento per determinare se si tratta di un dispositivo mobile. :(
muru,

1
Non proprio, dato che lo sto solo infliggendo a me stesso. Ho giocato con le proporzioni per un po 'e ho trovato i risultati insoddisfacenti. Poi mi sono ricordato di avere esattamente due scorciatoie per l'apertura dei terminali, per le dimensioni "normali" e per i terminali "larghi". Quindi i miei terminali hanno quasi sempre le stesse dimensioni. YMMV ovviamente.
Sato Katsura,

@SatoKatsura quel comando è una seria magia oscura. Sono molto sorpreso dal fatto che, oltre a non conoscere l' ==#operatore che ha :haiutato a chiarire, ho effettivamente compreso l'intero comando impazzito. Questo mi rende un esperto di Vim? Devo essere qualcosa del genere. Ho bisogno di uscire di più.
Steven Lu,

Risposte:


1

104 colonne / 51 linee = 2,04

Il calcolo è distorto perché le proporzioni di ciascuna cella sono verticali.

Ad esempio su Terminal.app, con font 23pt e spaziatura caratteri predefinita, ogni cella terminale ha una larghezza di 7px e un'altezza di 15px per un totale di 728x765px :

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


Non è possibile recuperare la dimensione del carattere all'interno di Vim senza richiamare comandi esterni o un modo di comunicare con il terminale, che può diventare piuttosto pesante. Ovviamente, questo è diverso in Gvim grazie a 'guifont'.

Se riesci a farlo, hai ancora bisogno di un modo per dedurre la dimensione di una cella che può variare a seconda del programma terminale se non esiste uno standard . Ho controllato solo iTerm 2 che fortunatamente ha lo stesso risultato.


Pertanto, opterei per una soluzione statica. Ho innestato il controllo di larghezza minima per questo frammento che potresti inserire 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 la finestra è abbastanza grande da contenere 80 colonne del buffer corrente, a destra viene aperta una divisione della guida stretta, altrimenti la divisione viene aperta in basso. È possibile personalizzare la direzione di divisione con :vertical.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.