tl; Dr.
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Önerdiğim çözüm diğer cevaplardan çok farklı olmasa da, daha ayrıntılı bir açıklama paylaşmak istiyorum.
orijinal davranış
İlk olarak, vimdurum satırını nasıl çizdiğini bulalım. Sorumlu fonksiyonlar win_redr_status()ve win_redr_ruler().
vimtampon alır adını , bir ekler boşluk izlenmesinin de bayraklar varsa (gibi [Help], [Preview], [+], [RO]). Sonra o ekler bayrakları .
Normalde cetvel için 18 karakter hücresi ayırır. Arabellek adı kısmı mevcut alanın geri kalanına uymuyorsa , soldan vim keser< ve başlangıçta ekler .
Oda varsa klavye haritası , onu ekler sonunda (sağ hizalanmış).
Şimdi, yönetici. <row>,<col>-<virtcol> Kısmen ve göreceli konumdan oluşur (sağa hizalı).
Tampon adıyla kısmı en azından bir almalıdır bir sınırlama da bulunmaktadır yarısı arasında genişliği .
çözüm
Şimdi dokümanlar tarafından önerilen değeri alalım :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
nerede
%< - 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
Dolayısıyla, %<varsayılan olarak arabellek adı başlangıçta kesildiği için ilk göz ardı edilebilir. Ardından, önizleme bayrağı ( %w) eksik . Ayrıca, pencere 18 * 2karakterlerden daha genişse, sağ kısım durum satırının yarısından fazlasını alır.
En azından atlayabilir %<ve ekleyebiliriz %w:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Daha ileri gidebilir ve doğru parçanın durum satırının yarısından fazlasını almadığından emin olabiliriz:
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
Sonra o özelliklerine bağlıdır yapabilirsiniz vimedildi ile derlenmiş .
if has("quickfix")
...
endif
Ancak bunun pratik olmadığını söyleyebilirim ve önceki çözüm çoğu amaç ve amaç için yeterli olacaktır. Ancak, son çözüm sizin için işe yaramazsa, bana neyin yanlış olduğunu söyleyin, ben daha iyi bir çözüm bulmaya çalışacağım.
Laurence Gonsalves tarafından önerilen çözümün sorunu, eğer bayrak yoksa, sol ve sağ kısımlar arasında iki boşluk bulunmasıdır:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)