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 vim
desenha a linha de status. As funções responsáveis são win_redr_status()
ewin_redr_ruler()
.
vim
leva 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 vim
foram 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%)