tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Sebbene la mia soluzione suggerita non differisca molto da quella delle altre risposte, vorrei condividere una spiegazione più dettagliata.
comportamento originale
Innanzitutto, scopriamo come vimdisegna la linea di stato. Le funzioni responsabili sono win_redr_status()e win_redr_ruler().
vimprende il buffer nome , aggiunge uno spazio se ci sono bandiere da seguire (come [Help], [Preview], [+], [RO]). Poi si aggiunge le bandiere .
Normalmente alloca 18 celle di caratteri per il righello. Se la parte del nome del buffer non si adatta al resto dello spazio disponibile, la vim tronca da sinistra e si aggiunge <all'inizio.
Se c'è spazio per il keymap , lo aggiunge alla fine (allineato a destra).
Ora, il sovrano. Consiste in <row>,<col>-<virtcol> parte e posizione relativa (allineato a destra).
C'è anche una restrizione che la parte con il nome del buffer deve occupare almeno la metà della larghezza .
soluzione
Ora prendiamo il valore suggerito dai documenti :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
dove
%< - 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
Quindi, il primo %<può essere omesso, poiché per impostazione predefinita il nome del buffer viene troncato all'inizio. Quindi, manca il flag di anteprima ( %w). Inoltre, quando la finestra è 18 * 2larga meno di caratteri, la parte destra occupa più della metà della riga di stato.
Quindi, almeno possiamo omettere %<e aggiungere %w:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Possiamo andare oltre e assicurarci che la parte giusta non occupi più della metà della linea di stato:
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
Quindi possiamo farlo dipendere dalle funzionalità con cui è vimstato compilato .
if has("quickfix")
...
endif
Ma direi che non è pratico e che la soluzione precedente sarebbe sufficiente per la maggior parte degli scopi. Tuttavia, se l'ultima soluzione non funziona per te, dimmi cosa c'è che non va e proverò a trovarne una migliore.
Il problema con la soluzione suggerita da Laurence Gonsalves è che se non ci sono bandiere, ci sono due spazi tra la parte sinistra e la parte destra:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)