Jaki jest format domyślnej linii statusu?

14

Przeczytałem o tym, jak zaktualizować linię statusu vima tutaj . Jestem w stanie zaktualizować go z powodzeniem.

Ale chciałbym zachować format domyślnej linii statusu vima i po prostu dodać do niego więcej informacji, np. Rozmiar pliku, typ pliku itp.

Domyślna linia statusu Vima to:

   <file-name>                              line_num,col_num        %file

Jak mogę wykonać następujące czynności?

  1. Chciałbym dodać informacje po nazwie pliku
  2. Wyświetl bieżący format linii stanu ( :set statuslinenic nie wyświetla)

Próbowałem:

set statusline+=%y

Ale to zastępuje całą linię statusu i wyświetla tylko typ pliku ( %y).

Jakieś wskazówki?

Mtk
źródło
2
Jeśli jesteś zainteresowany Vimem, sprawdź kasy Vi i Vim !
muru

Odpowiedzi:

15

Jak powiedział @muru, wydaje się, że nie można dokładnie symulować domyślnej linii statusu, gdy statuslinejest ustawiony jako kod do renderowania, robi rzeczy, których nie można określić w statuslineustawieniu. Można jednak podejść bardzo blisko. Oto rozsądne przybliżenie wyglądu domyślnej linii statusu, gdy rulerjest włączona:

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

Główną różnicą jest pozycjonowanie numerów linii i kolumn. Jeśli można zasymulować domyślną logikę odstępów, nie udało mi się znaleźć sposobu, aby to zrobić. Być może będzie to wystarczająco blisko do twoich celów.

Używam podzielonej wersji tego, .vimrcaby umieścić informacje o linii statusu Syntastic pośrodku czegoś, co wygląda jak normalna linia statusu vim z linijką:

" 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
źródło
7

Kod nie ustawia żadnej wartości na pusty ciąg statusu, ale po prostu działa przy użyciu niektórych wartości domyślnych. Zobacz src/screen.c, funkcjawin_redr_status() . Pokazane elementy są oparte na kompilowanych funkcjach, dlatego w celu odtworzenia dokładnej linii statusu należy przyjrzeć się kompilowanym funkcjom. Może być łatwiej użyć przykładowej linii statusu podanej w :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
muru
źródło
Co oznacza symbol kropki (.) Po szerokości (14) w %-14.(%l,%c%V%)?
Shamaoke
5

tl; dr

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

Chociaż moje sugerowane rozwiązanie nie różni się zbytnio od innych odpowiedzi, chciałbym podzielić się bardziej szczegółowym wyjaśnieniem.

oryginalne zachowanie

Najpierw dowiedzmy się, jak vimrysuje linię statusu. Odpowiedzialnymi funkcjami są win_redr_status()i win_redr_ruler().

vimbierze bufora nazwy , dodaje przestrzeni , czy są jakieś flagi do naśladowania (jak [Help], [Preview], [+], [RO]). Wtedy to dodaje się flagi .

Zwykle przydziela linijce 18 komórek znakowych . Jeśli część nazwy bufora nie pasuje do reszty dostępnego miejsca, vim obcina ją od lewej i dodaje <na początku.

Jeśli jest miejsce na mapę klawiszy , dodaje ją na końcu (wyrównane do prawej).

Teraz władca. Składa się z <row>,<col>-<virtcol> części i pozycji względnej (wyrównane do prawej).

Jest też ograniczenie, że część z nazwą bufora musi trwać co najmniej połowę tego szerokości .

rozwiązanie

Teraz weźmy wartość sugerowaną przez dokumenty :

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

gdzie

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

Pierwszego %<można więc pominąć, ponieważ domyślnie nazwa bufora jest obcięta na początku. Następnie brakuje flagi podglądu ( %w). Ponadto, gdy okno ma mniej niż 18 * 2szerokość znaków, prawa część zajmuje ponad połowę linii statusu.

Więc przynajmniej możemy pominąć %<i dodać %w:

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

Możemy pójść dalej i upewnić się, że odpowiednia część nie zajmie więcej niż połowy linii statusu:

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

Następnie możemy uzależnić to od funkcji, z którymi vimzostał skompilowany .

if has("quickfix")
    ...
endif

Ale powiedziałbym, że to nie jest praktyczne, a poprzednie rozwiązanie wystarczyłoby do większości celów i celów. Jeśli jednak ostatnie rozwiązanie nie zadziała, powiedz mi, co jest nie tak, a ja postaram się znaleźć coś lepszego.


Problem z rozwiązaniem sugerowanym przez Laurence Gonsalves polega na tym, że jeśli nie ma flag, pomiędzy lewą i prawą częścią są dwie spacje:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
x-yuri
źródło