Jak uzyskać faktyczną wysokość i szerokość Vima?

18

winheight()i winwidth()zwróć liczbę kolumn / linii w bieżącym oknie. To, czego szukam, to coś bliższego rzeczywistej wysokości i szerokości obszaru edycji lub obszaru wyświetlanego, jeśli jest uruchamiany w terminalu. Problemem winheight()i winwidth()że współczynnik kształtu obliczono z tych wartości jest w kontakcie z rzeczywistą proporcji.

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

Zrzut ekranu obszaru bufora ma wymiary 936 x 918 pikseli, co daje wyświetlany współczynnik kształtu wynoszący 1.019608. Myślę, że mogę uzyskać rzeczywistą wartość, używając rozmiaru czcionki, ale jak?

To kontynuacja Jak mogę pomóc Vimowi w otwarciu w pionie? . Próbuję dostosować rozwiązanie Nobe4 .

muru
źródło
3
Nie sądzę, że można uzyskać wymiary w pikselach za pomocą zwykłych funkcji Vima. Co do otwierania pomoc w pionowym rozłamu, nie przeszkadzało z obliczeń współczynnika kształtu, po prostu podzielona pionowo, jeśli okno terminala jest wystarczająco szeroka: cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>.
Sato Katsura
1
@SatoKatsura zgodnie z tradycją ustaloną przez większość programistów internetowych, którzy używają szerokości dokumentu, aby ustalić, czy jest to urządzenie mobilne. :(
muru
1
Niezupełnie, ponieważ sam sobie to narzucam. Przez jakiś czas grałem ze współczynnikiem kształtu i wyniki okazały się niezadowalające. Potem przypomniałem sobie, że mam dokładnie dwa skróty do otwierania terminali, do „normalnego” rozmiaru i do „szerokich” terminali. Więc moje terminale prawie zawsze mają takie same rozmiary. Oczywiście YMMV.
Sato Katsura
@SatoKatsura to polecenie to poważna mroczna magia. Jestem bardzo zaskoczony, że oprócz niewiedzy o ==#operatorze, który :hpomógł mi wyjaśnić, tak naprawdę zrozumiałem całe to dziwne polecenie. Czy to czyni mnie ekspertem od Vima? Musi być coś takiego. Potrzebujesz więcej wyjść.
Steven Lu,

Odpowiedzi:

1

104 kolumny / 51 linii = 2,04

Twoje obliczenia są wypaczone, ponieważ proporcje każdej komórki są pionowe.

Na przykład w Terminal.app, z czcionką 23pt i domyślnym odstępem między znakami, każda komórka terminalu ma szerokość 7px i wysokość 15px, co daje w sumie 728x765px :

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


Nie możesz pobrać rozmiaru czcionki z poziomu Vima bez wywoływania zewnętrznych poleceń lub sposobu komunikacji z terminalem, który może stać się dość ciężki. Oczywiście w Gvim jest inaczej 'guifont'.

Jeśli to zrobisz, nadal potrzebujesz sposobu na odjęcie wielkości komórki, która może się różnić w zależności od programu terminalowego, jeśli nie ma standardu . Sprawdziłem tylko iTerm 2, które na szczęście mają ten sam wynik.


Dlatego wybrałbym rozwiązanie statyczne. Przeszczepiłem kontrolę minimalnej szerokości do tego fragmentu, w którym możesz umieścić 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>)

Jeśli okno jest wystarczająco duże, aby pomieścić 80 kolumn bieżącego bufora, po prawej stronie otwiera się wąski podział pomocy, w przeciwnym razie podział otwiera się poniżej. Możesz dostosować kierunek podziału za pomocą :vertical.

LEI
źródło