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 vim
rysuje linię statusu. Odpowiedzialnymi funkcjami są win_redr_status()
i win_redr_ruler()
.
vim
bierze 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 * 2
szerokość 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 vim
został 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%)