tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Meskipun solusi yang saya sarankan tidak jauh berbeda dari jawaban yang lain, saya ingin membagikan penjelasan yang lebih rinci.
perilaku asli
Pertama, mari kita cari tahu cara vim
menggambar garis status. Fungsi yang bertanggung jawab adalah win_redr_status()
dan win_redr_ruler()
.
vim
mengambil buffer nama , menambahkan ruang jika ada bendera untuk mengikuti (seperti [Help]
, [Preview]
, [+]
, [RO]
). Kemudian ia menambahkan dengan bendera .
Biasanya itu mengalokasikan 18 sel karakter untuk penguasa. Jika bagian nama buffer tidak sesuai dengan sisa ruang yang tersedia, vim
potong dari kiri dan tambahkan <
di awal.
Jika ada ruang untuk keymap , itu menambahkannya di akhir (rata kanan).
Sekarang, penguasa. Ini terdiri dari <row>,<col>-<virtcol>
bagian dan posisi relatif (rata kanan).
Ada juga batasan bahwa bagian dengan nama penyangga harus mengambil setidaknya setengah dari lebar .
larutan
Sekarang mari kita ambil nilai yang disarankan oleh dokumen :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
dimana
%< - where to truncate the line if too long
%f - buffer name (path to a file, or something)
%h - help flag
%m - modified flag
%r - readonly flag
%= - separater between the left (buffer name) and the right (ruler) parts
%-14.(...%) - minimum field width == 14
%l - line
%c - column
%V - virtual column
%P - percentage
Jadi, pertama %<
dapat dihilangkan, karena secara default nama buffer terpotong di awal. Kemudian, tidak ada bendera pratinjau ( %w
). Juga, ketika 18 * 2
lebar jendela kurang dari karakter, bagian kanan mengambil lebih dari setengah dari baris status.
Jadi, setidaknya kita dapat menghilangkan %<
dan menambahkan %w
:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Kita dapat melangkah lebih jauh dan memastikan bagian yang tepat tidak mengambil lebih dari setengah dari baris status:
set statusline=%!MyStatusLine()
function! MyStatusLine()
let l:w = min([14,winwidth(0)/2-3])
return '%f %h%w%m%r%=%-' . l:w . '.(%l,%c%V%) %P'
endfunction
Kemudian kita dapat membuatnya tergantung pada fitur vim
yang dikompilasi .
if has("quickfix")
...
endif
Tetapi saya mengatakan bahwa itu tidak praktis, dan solusi sebelumnya akan cukup untuk sebagian besar maksud dan tujuan. Namun, jika solusi terakhir tidak berhasil untuk Anda, katakan padaku apa yang salah, dan saya akan mencoba untuk membuat yang lebih baik.
Masalah dengan solusi yang disarankan oleh Laurence Gonsalves adalah bahwa jika tidak ada bendera, ada dua ruang antara bagian kiri dan kanan:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)