tl; dr
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Aunque mi solución sugerida no difiere mucho de la de las otras respuestas, me gustaría compartir una explicación más detallada.
comportamiento original
Primero, descubramos cómo vim
dibuja la línea de estado. Las funciones responsables son win_redr_status()
y win_redr_ruler()
.
vim
toma el buffer nombre , añade un espacio si hay algún banderas a seguir (como [Help]
, [Preview]
, [+]
, [RO]
). A continuación, se añade las banderas .
Normalmente asigna 18 celdas de caracteres para la regla. Si la parte del nombre del búfer no se ajusta al resto del espacio disponible, se vim
trunca desde la izquierda y se agrega <
al principio.
Si hay espacio para el mapa de teclas , lo agrega al final (alineado a la derecha).
Ahora, la regla. Se compone de <row>,<col>-<virtcol>
parte y posición relativa (alineado a la derecha).
También hay una restricción de que la parte con el nombre del búfer debe tener al menos la mitad del ancho .
solución
Ahora tomemos el valor sugerido por los documentos :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
dónde
%< - 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
Entonces, primero %<
se puede omitir, ya que por defecto el nombre del búfer se trunca al principio. Entonces, falta la bandera de vista previa ( %w
). Además, cuando la ventana tiene menos de 18 * 2
caracteres de ancho, la parte derecha ocupa más de la mitad de la línea de estado.
Entonces, al menos podemos omitir %<
y agregar %w
:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Podemos ir más allá y asegurarnos de que la parte correcta no ocupe más de la mitad de la línea de estado:
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
Entonces podemos hacer que dependa de las características con las que vim
se compiló .
if has("quickfix")
...
endif
Pero diría que eso no es práctico, y la solución anterior sería suficiente para la mayoría de los intentos y propósitos. Sin embargo, si la última solución no funciona para usted, dígame qué sucede y trataré de encontrar una mejor.
El problema con la solución sugerida por Laurence Gonsalves es que si no hay banderas, hay dos espacios entre las partes izquierda y derecha:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)