tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Bien que ma solution suggérée ne diffère pas beaucoup de celle des autres réponses, je voudrais partager une explication plus détaillée.
comportement d'origine
Voyons d'abord comment vim
dessine la ligne d'état. Les fonctions responsables sont win_redr_status()
et win_redr_ruler()
.
vim
prend le tampon nom , ajoute un espace s'il y a des drapeaux à suivre (comme [Help]
, [Preview]
, [+]
, [RO]
). Ensuite, il ajoute les drapeaux .
Normalement, il alloue 18 cellules de caractères à la règle. Si la partie du nom du tampon ne correspond pas au reste de l'espace disponible, il la vim
tronque à gauche et l'ajoute <
au début.
S'il y a de la place pour le clavier , il l'ajoute à la fin (aligné à droite).
Maintenant, la règle. Il se compose d'une <row>,<col>-<virtcol>
partie et de la position relative (aligné à droite).
Il existe également une restriction selon laquelle la partie portant le nom du tampon doit occuper au moins la moitié de la largeur .
Solution
Prenons maintenant la valeur suggérée par les documents :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
où
%< - 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
Ainsi, le premier %<
peut être omis, car par défaut, le nom du tampon est tronqué au début. Ensuite, il manque l'indicateur de prévisualisation ( %w
). De plus, lorsque la fenêtre a moins de 18 * 2
caractères de large, la partie droite occupe plus de la moitié de la ligne d'état.
Donc, au moins, nous pouvons omettre %<
et ajouter %w
:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Nous pouvons aller plus loin et nous assurer que la bonne partie ne prend pas plus de la moitié de la ligne d'état:
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
Ensuite , nous pouvons faire dépendre des caractéristiques vim
a été compilé avec .
if has("quickfix")
...
endif
Mais je dirais que ce n'est pas pratique, et la solution précédente suffirait pour la plupart des intentions. Cependant, si la dernière solution ne fonctionne pas pour vous, dites-moi ce qui ne va pas et j'essaierai d'en trouver une meilleure.
Le problème avec la solution suggérée par Laurence Gonsalves est que s'il n'y a pas de drapeaux, il y a deux espaces entre les parties gauche et droite:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)