Was ist das Format der Standardstatuszeile?

14

Ich las darüber , wie die vim Statuszeile aktualisieren hier . Und ich kann es erfolgreich aktualisieren.

Ich möchte jedoch das Format der vim-Standardstatuszeile beibehalten und nur weitere Informationen hinzufügen, z. B. Dateigröße, Dateityp usw.

Die Standardstatuszeile von Vim lautet:

   <file-name>                              line_num,col_num        %file

Wie könnte ich das Folgende tun?

  1. Ich möchte Informationen nach dem Dateinamen hinzufügen
  2. Zeigt das aktuelle Format der Statuszeile an ( :set statuslinezeigt nichts an)

Ich habe es versucht:

set statusline+=%y

Dies überschreibt jedoch die gesamte Statuszeile und zeigt nur den Dateityp ( %y) an.

Irgendwelche Hinweise?

mtk
quelle
2
Wenn Sie sich für Vim interessieren, sehen Sie sich Vi und Vim an !
muru

Antworten:

15

Wie @muru sagte, scheint es nicht möglich zu sein , die Standardstatuszeile genau zu simulieren, wenn statuslineals Code zum Rendern Dinge festgelegt sind, die in der statuslineEinstellung nicht angegeben werden können . Es ist jedoch möglich, ziemlich nahe zu kommen. Hier ist eine sinnvolle Annäherung an die Art und Weise, wie die Standardstatuszeile aussieht, wenn ruleraktiviert ist:

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

Der Hauptunterschied ist die Positionierung der Zeilen- und Spaltennummern. Wenn es möglich ist, die Standard-Abstandslogik zu simulieren, konnte ich keine Möglichkeit finden, dies zu tun. Vielleicht ist dies für Ihre Zwecke nah genug.

Ich benutze eine geteilte Version davon .vimrc, um Syntastische Statuszeileninformationen in die Mitte einer normalen VIM-Statuszeile mit Lineal zu setzen:

" 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
quelle
7

Der Code setzt keinen Wert auf eine leere Statuszeichenfolge, sondern verwendet einfach einige Standardwerte. Siehe src/screen.cFunktionwin_redr_status() . Die Elemente gezeigt basieren auf kompilierten Funktionen in daher die genaue Statuszeile ein auf die Features in kompilierten aussehen müsste zu rekonstruieren Es könnte einfacher sein , die beispielsweise in Statuszeile angegeben zu verwenden. :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
muru
quelle
Was bedeutet das Punktsymbol (.) Nach der Breite (14) in %-14.(%l,%c%V%)?
Shamaoke
4

tl; dr

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

Obwohl sich mein Lösungsvorschlag nicht wesentlich von den anderen Antworten unterscheidet, möchte ich eine detailliertere Erklärung geben.

ursprüngliches Verhalten

Lassen Sie uns zunächst herausfinden, wie vimdie Statuszeile gezeichnet wird. Die verantwortlichen Funktionen sind win_redr_status()und win_redr_ruler().

vimnimmt den Puffernamen , fügt einen Raum , ob es irgendwelche Flags (wie zu folgen [Help], [Preview], [+], [RO]). Dann es fügt die Fahnen .

Normalerweise werden dem Lineal 18 Zeichenzellen zugewiesen . Wenn der Name des Puffers nicht in den Rest des verfügbaren Speicherplatzes passt, wird er von links vim abgeschnitten und <am Anfang hinzugefügt .

Wenn Platz für eine Tastaturbelegung vorhanden ist , wird diese am Ende hinzugefügt (rechtsbündig).

Nun der Herrscher. Es besteht aus <row>,<col>-<virtcol> Teil und relativer Position (rechtsbündig).

Es gibt auch eine Einschränkung, dass der Teil mit dem Puffernamen mindestens die Hälfte der Breite haben muss .

Lösung

Nehmen wir nun den in den Dokumenten vorgeschlagenen Wert :

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

wo

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

So %<kann zunächst verzichtet werden, da standardmäßig der Puffername am Anfang abgeschnitten wird. Dann fehlt das Vorschau-Flag ( %w). Wenn das Fenster kürzer als die 18 * 2Zeichenbreite ist, nimmt der rechte Teil mehr als die Hälfte der Statuszeile ein.

Zumindest können wir also weglassen %<und hinzufügen %w:

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

Wir können noch weiter gehen und sicherstellen, dass der richtige Teil nicht mehr als die Hälfte der Statuszeile einnimmt:

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

Dann können wir es auf den Merkmalen abhängig machen vimwurde zusammengestellt mit .

if has("quickfix")
    ...
endif

Aber ich würde sagen, dass das nicht praktikabel ist und die vorherige Lösung für die meisten Absichten und Zwecke ausreichen würde. Wenn die letzte Lösung für Sie jedoch nicht funktioniert, sagen Sie mir, was nicht stimmt, und ich werde versuchen, eine bessere Lösung zu finden.


Das Problem bei der von Laurence Gonsalves vorgeschlagenen Lösung ist, dass, wenn keine Flags vorhanden sind, zwischen dem linken und dem rechten Teil zwei Leerzeichen vorhanden sind:

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