Qual è il formato della linea di stato predefinita?


14

Ho letto su come aggiornare la statusline di vim qui . E sono in grado di aggiornarlo con successo.

Tuttavia, vorrei mantenere il formato della linea di stato predefinita di vim e aggiungere solo alcune informazioni ad esempio ad esempio dimensione del file, tipo di file, ecc.

La riga di stato predefinita di Vim è:

   <file-name>                              line_num,col_num        %file

Come potrei fare quanto segue?

  1. Vorrei aggiungere informazioni dopo il nome del file
  2. Visualizza il formato corrente di statusline ( :set statuslinenon visualizza nulla)

Provai:

set statusline+=%y

Ma questo sovrascrive l'intera linea di stato e visualizza solo il tipo di file ( %y).

Qualche suggerimento?


2
Se sei interessato a Vim, dai un'occhiata a Vi e Vim !
muru,

Risposte:


15

Come ha detto @muru, non sembra possibile simulare esattamente la riga di stato predefinita quando statuslineè impostato come codice per il rendering, fa cose che non possono essere specificate statuslinenell'impostazione. È possibile avvicinarsi piuttosto, comunque. Ecco un'approssimazione ragionevole dell'aspetto della linea di stato predefinita quando rulerè abilitato:

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

La differenza principale è il posizionamento dei numeri di riga e colonna. Se è possibile simulare la logica di spaziatura predefinita, non sono stato in grado di trovare un modo per farlo. Forse questo sarà abbastanza vicino per i tuoi scopi.

Uso una versione divisa di questo .vimrcper posizionare le informazioni sulla riga di stato sintetico nel mezzo di quella che sembra una normale linea di stato vim con righello:

" 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

Il codice non imposta alcun valore su una stringa di stato vuota, ma agisce semplicemente utilizzando alcune impostazioni predefinite. Vedi src/screen.c, funzionewin_redr_status() . Gli elementi mostrati si basano sulle funzionalità compilate, quindi per ricostruire l'esatta statusline occorrerebbe esaminare le funzionalità compilate. Potrebbe essere più semplice utilizzare l'esempio statusline fornito in :h statusline:

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

Cosa significa il simbolo punto (.) Dopo la larghezza (14) %-14.(%l,%c%V%)?
Shamaoke,

5

tl; dr

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

Sebbene la mia soluzione suggerita non differisca molto da quella delle altre risposte, vorrei condividere una spiegazione più dettagliata.

comportamento originale

Innanzitutto, scopriamo come vimdisegna la linea di stato. Le funzioni responsabili sono win_redr_status()e win_redr_ruler().

vimprende il buffer nome , aggiunge uno spazio se ci sono bandiere da seguire (come [Help], [Preview], [+], [RO]). Poi si aggiunge le bandiere .

Normalmente alloca 18 celle di caratteri per il righello. Se la parte del nome del buffer non si adatta al resto dello spazio disponibile, la vim tronca da sinistra e si aggiunge <all'inizio.

Se c'è spazio per il keymap , lo aggiunge alla fine (allineato a destra).

Ora, il sovrano. Consiste in <row>,<col>-<virtcol> parte e posizione relativa (allineato a destra).

C'è anche una restrizione che la parte con il nome del buffer deve occupare almeno la metà della larghezza .

soluzione

Ora prendiamo il valore suggerito dai documenti :

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

dove

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

Quindi, il primo %<può essere omesso, poiché per impostazione predefinita il nome del buffer viene troncato all'inizio. Quindi, manca il flag di anteprima ( %w). Inoltre, quando la finestra è 18 * 2larga meno di caratteri, la parte destra occupa più della metà della riga di stato.

Quindi, almeno possiamo omettere %<e aggiungere %w:

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

Possiamo andare oltre e assicurarci che la parte giusta non occupi più della metà della linea di stato:

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

Quindi possiamo farlo dipendere dalle funzionalità con cui è vimstato compilato .

if has("quickfix")
    ...
endif

Ma direi che non è pratico e che la soluzione precedente sarebbe sufficiente per la maggior parte degli scopi. Tuttavia, se l'ultima soluzione non funziona per te, dimmi cosa c'è che non va e proverò a trovarne una migliore.


Il problema con la soluzione suggerita da Laurence Gonsalves è che se non ci sono bandiere, ci sono due spazi tra la parte sinistra e la parte destra:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.