tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Embora minha solução sugerida não seja muito diferente da das outras respostas, gostaria de compartilhar uma explicação mais detalhada.
comportamento original
Primeiro, vamos descobrir como vimdesenha a linha de status. As funções responsáveis são win_redr_status()ewin_redr_ruler() .
vimleva o buffer de nome , adiciona um espaço se houver algum bandeiras a serem seguidas (como [Help], [Preview], [+], [RO]). Em seguida , adiciona as bandeiras .
Normalmente, ele aloca 18 células de caracteres para a régua. Se a parte do nome do buffer não couber, o restante do espaço disponível o vim trunca da esquerda e adiciona< no início.
Se houver espaço para o mapa de teclas , ele será adicionado no final (alinhado à direita).
Agora, o governante. Consiste em <row>,<col>-<virtcol> parte e posição relativa (alinhada à direita).
Há também uma restrição de que a parte com o nome do buffer deve ter pelo menos metade da largura .
solução
Agora vamos pegar o valor sugerido pelos documentos :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
Onde
%< - 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
Portanto, primeiro %<pode ser omitido, pois, por padrão, o nome do buffer é truncado no início. Em seguida, está faltando o sinalizador de visualização ( %w). Além disso, quando a janela é menor que18 * 2 caracteres, a parte correta ocupa mais da metade da linha de status.
Portanto, pelo menos podemos omitir %<e adicionar %w:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Podemos ir além e garantir que a parte certa não ocupe mais da metade da linha de status:
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
Em seguida, podemos fazê-lo depender dos recursos que vimforam compilados .
if has("quickfix")
...
endif
Mas eu diria que isso não é prático, e a solução anterior seria suficiente para a maioria das intenções e propósitos. No entanto, se a última solução não funcionar para você, diga-me o que há de errado e tentarei encontrar uma melhor.
O problema com a solução sugerida por Laurence Gonsalves é que, se não houver sinalizadores, haverá dois espaços entre as partes esquerda e direita:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)