Qual é o formato da linha de status padrão?


14

Eu li sobre como atualizar a linha de status do vim aqui . E eu posso atualizá-lo com sucesso.

Mas, gostaria de manter o formato da linha de status padrão do vim e apenas adicionar mais algumas informações, como tamanho do arquivo, tipo de arquivo etc.

A linha de status padrão do Vim é:

   <file-name>                              line_num,col_num        %file

Como eu poderia fazer o seguinte?

  1. Gostaria de adicionar informações após o nome do arquivo
  2. Exibir o formato atual da linha de status ( :set statuslinenão exibe nada)

Eu tentei:

set statusline+=%y

Mas isso substitui a linha de status inteira e apenas exibe o tipo de arquivo ( %y).

Alguma dica?


2
Se você estiver interessado no Vim, faça o check-out do Vi e do Vim !
Muru

Respostas:


15

Como o @muru disse, não parece possível simular exatamente a linha de status padrão quando statuslineé definida como o código para renderizar o que faz coisas que não podem ser especificadas na statuslineconfiguração. É possível chegar bem perto, no entanto. Aqui está uma aproximação razoável da aparência da linha de status padrão quando rulerestá habilitada:

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

A principal diferença é o posicionamento dos números de linha e coluna. Se for possível simular a lógica de espaçamento padrão, não consegui descobrir uma maneira de fazê-lo. Talvez isso seja próximo o suficiente para seus propósitos.

Eu uso uma versão dividida disso .vimrcpara colocar informações da linha de status do Syntastic no meio do que parece uma linha de status normal do vim com a régua:

" 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%)

7

O código não define nenhum valor para uma cadeia de status vazia, mas simplesmente age usando alguns padrões. Veja src/screen.c, funçãowin_redr_status() . Os itens mostrados são baseados nos recursos compilados, portanto, para reconstruir a linha de status exata, é necessário examinar os recursos compilados. Pode ser mais simples usar a linha de status de exemplo fornecida em :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

O que significa o símbolo de ponto (.) Após a largura (14) %-14.(%l,%c%V%)?
Shamaoke 26/01

4

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%)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.