Bagaimana cara mendapatkan tinggi dan lebar Vim yang sebenarnya?

18

winheight()dan winwidth()kembalikan jumlah kolom / garis di jendela saat ini. Yang saya cari adalah sesuatu yang lebih dekat dengan tinggi dan lebar sebenarnya dari area pengeditan, atau area yang ditampilkan jika dijalankan di terminal. Masalah dengan winheight()dan winwidth()apakah rasio aspek yang dihitung dari nilai-nilai ini tidak berhubungan dengan rasio aspek yang sebenarnya.

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

Tangkapan layar area buffer berukuran 936x918 piksel, memberikan rasio aspek yang ditampilkan 1.019608. Saya pikir saya bisa mendapatkan nilai aktual dengan menggunakan ukuran font, tapi bagaimana caranya?

Ini adalah tindak lanjut dari Bagaimana saya bisa membuat Vim membuka bantuan dalam pemisahan vertikal? . Saya mencoba mengadaptasi solusi Nobe4 .

muru
sumber
3
Saya tidak berpikir Anda bisa mendapatkan dimensi dalam piksel dengan fungsi Vim biasa. Seperti untuk membuka bantuan dalam hitungan vertikal, saya tidak repot-repot dengan perhitungan rasio aspek, saya hanya membagi secara vertikal jika jendela terminal cukup lebar: cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>.
Sato Katsura
1
@SatoKatsura mengikuti tradisi yang ditetapkan oleh sebagian besar pengembang web, yang menggunakan lebar dokumen untuk menentukan apakah itu ponsel. :(
muru
1
Tidak juga, karena aku hanya memaksakan itu pada diriku sendiri. Saya bermain dengan aspek rasio untuk sementara waktu dan saya menemukan hasilnya tidak memuaskan. Lalu saya ingat saya memiliki dua pintasan untuk membuka terminal, untuk ukuran "normal", dan untuk terminal "lebar". Jadi terminal saya hampir selalu memiliki ukuran yang sama. YMMV tentu saja.
Sato Katsura
@SatoKatsura perintah itu adalah sihir gelap yang serius. Saya sangat terkejut bahwa selain tidak tahu tentang ==#operator yang :hmembantu menjernihkan saya sebenarnya mengerti seluruh perintah panik. Apakah itu membuat saya seorang ahli Vim? Harus seperti itu. Perlu keluar lebih banyak.
Steven Lu

Jawaban:

1

104 kolom / 51 baris = 2.04

Perhitungan Anda condong karena rasio aspek setiap sel vertikal.

Sebagai contoh pada Terminal.app, dengan font 23pt dan spasi karakter default, setiap sel terminal memiliki lebar 7px dan tinggi 15px dengan total 728x765px :

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


Anda tidak dapat mengambil ukuran font dari dalam Vim tanpa menggunakan perintah eksternal atau cara berkomunikasi dengan terminal, yang bisa menjadi sangat berat. Jelas, ini berbeda di Gvim berkat 'guifont'.

Jika Anda berhasil melakukannya, Anda masih perlu cara untuk mengurangi ukuran sel yang dapat bervariasi tergantung pada program terminal jika tidak ada standar . Saya hanya memeriksa iTerm 2 yang untungnya memiliki hasil yang sama.


Karena itu saya akan memilih solusi statis. Saya mencangkokkan cek lebar minimum untuk potongan ini yang dapat Anda tempatkan di 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>)

Jika jendela cukup besar untuk menyimpan 80 kolom buffer saat ini, split bantuan sempit dibuka di sebelah kanan, jika tidak, split dibuka di bawah. Anda dapat menyesuaikan arah split dengan :vertical.

LEI
sumber