tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Chociaż moje sugerowane rozwiązanie nie różni się zbytnio od innych odpowiedzi, chciałbym podzielić się bardziej szczegółowym wyjaśnieniem.
oryginalne zachowanie
Najpierw dowiedzmy się, jak vimrysuje linię statusu. Odpowiedzialnymi funkcjami są win_redr_status()i win_redr_ruler().
vimbierze bufora nazwy , dodaje przestrzeni , czy są jakieś flagi do naśladowania (jak [Help], [Preview], [+], [RO]). Wtedy to dodaje się flagi .
Zwykle przydziela linijce 18 komórek znakowych . Jeśli część nazwy bufora nie pasuje do reszty dostępnego miejsca, vim obcina ją od lewej i dodaje <na początku.
Jeśli jest miejsce na mapę klawiszy , dodaje ją na końcu (wyrównane do prawej).
Teraz władca. Składa się z <row>,<col>-<virtcol> części i pozycji względnej (wyrównane do prawej).
Jest też ograniczenie, że część z nazwą bufora musi trwać co najmniej połowę tego szerokości .
rozwiązanie
Teraz weźmy wartość sugerowaną przez dokumenty :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
gdzie
%< - 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
Pierwszego %<można więc pominąć, ponieważ domyślnie nazwa bufora jest obcięta na początku. Następnie brakuje flagi podglądu ( %w). Ponadto, gdy okno ma mniej niż 18 * 2szerokość znaków, prawa część zajmuje ponad połowę linii statusu.
Więc przynajmniej możemy pominąć %<i dodać %w:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Możemy pójść dalej i upewnić się, że odpowiednia część nie zajmie więcej niż połowy linii statusu:
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
Następnie możemy uzależnić to od funkcji, z którymi vimzostał skompilowany .
if has("quickfix")
...
endif
Ale powiedziałbym, że to nie jest praktyczne, a poprzednie rozwiązanie wystarczyłoby do większości celów i celów. Jeśli jednak ostatnie rozwiązanie nie zadziała, powiedz mi, co jest nie tak, a ja postaram się znaleźć coś lepszego.
Problem z rozwiązaniem sugerowanym przez Laurence Gonsalves polega na tym, że jeśli nie ma flag, pomiędzy lewą i prawą częścią są dwie spacje:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)