¿Cuál es el formato de la línea de estado predeterminada?

14

Leí sobre cómo actualizar la línea de estado de vim aquí . Y puedo actualizarlo con éxito.

Pero, me gustaría conservar el formato de la línea de estado vim predeterminada y solo agregarle más información, por ejemplo, tamaño de archivo, tipo de archivo, etc.

La línea de estado predeterminada de Vim es:

   <file-name>                              line_num,col_num        %file

¿Cómo podría hacer lo siguiente?

  1. Me gustaría agregar información después del nombre del archivo
  2. Mostrar el formato actual de la línea de estado ( :set statuslineno muestra nada)

Lo intenté:

set statusline+=%y

Pero esto sobrescribe toda la línea de estado y solo muestra el tipo de archivo ( %y).

¿Alguna pista?

mtk
fuente
2
Si estás interesado en Vim, ¡mira Vi y Vim !
muru

Respuestas:

15

Como dijo @muru, no parece posible simular exactamente la línea de estado predeterminada cuando statuslinese establece como el código para representarlo hace cosas que no se pueden especificar en la statuslineconfiguración. Sin embargo, es posible acercarse bastante. Aquí hay una aproximación razonable de la apariencia de la línea de estado predeterminada cuando rulerestá habilitada:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)

La principal diferencia es el posicionamiento de los números de línea y columna. Si es posible simular la lógica de espaciado predeterminada, no he podido encontrar una manera de hacerlo. Quizás esto sea lo suficientemente cerca para sus propósitos.

Utilizo una versión dividida de esto .vimrcpara colocar la información de la línea de estado Syntastic en el medio de lo que parece una línea de estado vim normal con regla:

" start of default statusline
set statusline=%f\ %h%w%m%r\ 
" NOTE: preceding line has a trailing space character

" Syntastic statusline
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

" end of default statusline (with ruler)
set statusline+=%=%(%l,%c%V\ %=\ %P%)
Laurence Gonsalves
fuente
7

El código no establece ningún valor en una cadena de estado vacía, sino que simplemente actúa usando algunos valores predeterminados. Ver src/screen.c, funciónwin_redr_status() . Los elementos que se muestran se basan en características compiladas, por lo tanto, para reconstruir la línea de estado exacta, sería necesario mirar las características compiladas. Puede ser más sencillo usar la línea de estado de ejemplo que se proporciona en :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
muru
fuente
¿Qué significa el símbolo de punto (.) Después del ancho (14) %-14.(%l,%c%V%)?
Shamaoke
5

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 vimdibuja la línea de estado. Las funciones responsables son win_redr_status()y win_redr_ruler().

vimtoma 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 * 2caracteres 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 vimse 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%)
x-yuri
fuente