tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Obwohl sich mein Lösungsvorschlag nicht wesentlich von den anderen Antworten unterscheidet, möchte ich eine detailliertere Erklärung geben.
ursprüngliches Verhalten
Lassen Sie uns zunächst herausfinden, wie vimdie Statuszeile gezeichnet wird. Die verantwortlichen Funktionen sind win_redr_status()und win_redr_ruler().
vimnimmt den Puffernamen , fügt einen Raum , ob es irgendwelche Flags (wie zu folgen [Help], [Preview], [+], [RO]). Dann es fügt die Fahnen .
Normalerweise werden dem Lineal 18 Zeichenzellen zugewiesen . Wenn der Name des Puffers nicht in den Rest des verfügbaren Speicherplatzes passt, wird er von links vim abgeschnitten und <am Anfang hinzugefügt .
Wenn Platz für eine Tastaturbelegung vorhanden ist , wird diese am Ende hinzugefügt (rechtsbündig).
Nun der Herrscher. Es besteht aus <row>,<col>-<virtcol> Teil und relativer Position (rechtsbündig).
Es gibt auch eine Einschränkung, dass der Teil mit dem Puffernamen mindestens die Hälfte der Breite haben muss .
Lösung
Nehmen wir nun den in den Dokumenten vorgeschlagenen Wert :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
wo
%< - 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
So %<kann zunächst verzichtet werden, da standardmäßig der Puffername am Anfang abgeschnitten wird. Dann fehlt das Vorschau-Flag ( %w). Wenn das Fenster kürzer als die 18 * 2Zeichenbreite ist, nimmt der rechte Teil mehr als die Hälfte der Statuszeile ein.
Zumindest können wir also weglassen %<und hinzufügen %w:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Wir können noch weiter gehen und sicherstellen, dass der richtige Teil nicht mehr als die Hälfte der Statuszeile einnimmt:
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
Dann können wir es auf den Merkmalen abhängig machen vimwurde zusammengestellt mit .
if has("quickfix")
...
endif
Aber ich würde sagen, dass das nicht praktikabel ist und die vorherige Lösung für die meisten Absichten und Zwecke ausreichen würde. Wenn die letzte Lösung für Sie jedoch nicht funktioniert, sagen Sie mir, was nicht stimmt, und ich werde versuchen, eine bessere Lösung zu finden.
Das Problem bei der von Laurence Gonsalves vorgeschlagenen Lösung ist, dass, wenn keine Flags vorhanden sind, zwischen dem linken und dem rechten Teil zwei Leerzeichen vorhanden sind:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)