[~] BACK



~~ VIM STATUSLINE ~~

** DIE DIY STATUSLEISTE **

[VIM] | [20230622] | [0] | [0x17]




Dass ich gerne Vim benutze, ist kein Geheimnis. Vim zeichnet sich durch seine Erweiterbarkeit aus. So gibt es auch wunderbare Plugins und Module die die Statusleiste hübsch machen. Also die Leiste am unteren Rand von Vim die alle wichtigen Informationen beinhaltet. Klar, ich könnte zu Airline oder Lightline greifen ... oder die Statusline selber bauen. Also bau ich selber eine.

0x01 - STATUSLINE




Die Statusline in Vim beinhaltet jede Menge Infos, die dabei helfen den Überblick zu behalten. So zum Beispiel welcher Modus gerade aktiv ist, Dateiname der geöffneten Datei, gibt es Änderungen im File, Fileformat, Encoding, Position des Cursors im File und so weiter. Wer es unkompliziert haben will, greift in dem Fall zu oben erwähnten Plugins, installiert die per Plugin Manager und hat Spaß damit. Wer allerdings nicht ganz zufrieden damit ist, baut sich seine Statusline selber in der .vimrc File. Das klingt zuerst unfassbar kompliziert und nach "OP am offenen Herzen", aber ich kann euch beruhigen. Es ist einfacher als gedacht.

Wie so vieles, kann auch die Statusline in der .vimrc konfiguriert werden. Die .vimrc liegt per default in eurem $HOME Verzeichnis. Die .vimrc ist in VimScript geschrieben, aber trotzdem relativ gut zu lesen.

0x02 - STATUSLINE AKTIVIEREN


Im ersten Schritt aktivieren wir die Statusline (wenn nicht schon passiert) mit folgendem Eintrag:



.VIMRC
	  set laststatus=2 
	


Damit habt ihr die nach dem Neustart von Vim die Statusline aktiviert. Nun geht es an den Content. Denn nach der einfachen aktivierung habt ihr nur eine weiße Statusline mit dem Filename. Das ist auf Dauer langweilig und wenig informativ. Um Module bzw. Infos zur Statusline hinzuzufügen, braucht es in der .vimrc folgenden Eintrag pro Element, dass hinzugefügt werden soll:



.VIMRC
	  set statusline= 
	


Dahinter kommen unsere Module und Elemente die wir einfügen wollen. Meine Statusline beginnt mit einem kleinen Alien. Das sieht in der .vimrc so aus:



.VIMRC
	  set statusline= 
	  set statusline+=\  
	


Damit mehrere Elemente hintereinander in der Statusline angezeigt werden, wird hier zu set statusline= ein "+" hinzugefügt, also set statusline+=. Das war noch Spielerei und ist nicht wirklich essentiell für die Produktivität. Wichtiger ist dagegen der aktuelle Mode in dem Vim sich befindet und das am liebsten noch farbig. Hier braucht es etwas mehr.

0x03 - VIM MODE


Um den Mode anzeigen zu können, in dem sich vim befindet, braucht es etwas mehr Scripting. Bevor wir also den Mode in der Statusline anzeigen lassen können, braucht es folgendes Script-Snippet in der .vimrc:



.VIMRC
	  let g:currentmode={
	   \ 'n' : 'NORMAL ',
	   \ 'v' : 'VISUAL ',
	   \ 'V' : 'V-LINE ',
	   \ 'i' : 'INSERT ',
	   \ 'R' : 'R ',
	   \ 'Rv' : 'V-REPLACE ',
	   \ 'c' : 'COMMAND ',
	   \}
	


Mit let g: werden die Variablen global angelegt, damit sie von überall erreichbar und abrufbar sind. Jetzt müssen die Modes noch an die Statusline weitergegeben werden:



.VIMRC
	  statusline+=\ %#NormalC#%{(mode()=='n')?'\ NORMAL\ ':''} 
	  statusline+=\ %#InsertC#%{(mode()=='i')?'\ INSERT\ ':''} 
	  statusline+=\ %#VisualC#%{(mode()=='v')?'\ VISUAL\ ':''} 
	


Die Variablen %#NormalC#%, %#InsertC'% und %#Visual#% definieren hier die Colors die verwendet werden. Diese werden direkt aus dem benutzten Colorscheme gezogen. Hier erschließt sich ein großer Vorteil aus dem Statusline-Eigenbau. Wir haben hier die Möglichkeit die Colors direkt aus dem Vim-Theme zu ziehen und brauchen kein separates Statusline Colorscheme. Das kann unter Lightline bspw. recht hakelig sein (das erstellen des eigenen Vim Colorscheme steht hier auc hschon auf er Liste mit Sachen die ich mal niederschreiben muss).
Alienhead + Mode sind schon mal ganz schick aber die Statusline kann noch mehr.

0x04 - MODULE


Wie ich weiter oben schon geschrieben habe gibt es diverse Module die wir in die Statusline einbauen können. Eine gute Übersicht aller Möglichkeiten bietet die Vim-Help. Hier könnt ihr euch Module aussuchen die ihr in eure Statusline einbauen könnt. Das Help-file zur Statusline findet ihr in Vim mir :help statusline. In meiner Statusline finden sich neben Alienhead und Modus auch Filename, Changes, Fileformat, Encoding und die Zeilenposition und Gesamtzeilenanzahl. Der nächste teil meiner .vimrc sieht wie folgt aus:



.VIMRC
    set statusline+=%#Filename#
    set statusline+=\ %f
    set statusline+=%#ReadOnly#
    set statusline+=\ %r
    set statusline+=%m
    set statusline+=%=
    set statusline+=%#Fileformat#
    set statusline+=\ %y
    set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
    set statusline+=\ [%{&fileformat}\]
    set statusline+=%#Position#
    set statusline+=\ [%l/%L]
	


Die klar lesbaren Variablen sind wieder die Colorcodes. Der Rest sind Variablen die in der Helpfile auch gelistet sind:


.VIMRC
    %f  -- Filename
    %r  -- Readonly
    %m  -- Modified (y/n)
    %=  -- Alles was folgt ist rechts in der statusline
    %y  -- 
    %{&fileencoding?&fileencoding:&encoding}  -- Encoding
    [%{&fileformat}\]  -- Fileformat
    [%l/%L] -- Cursorline / Lines Total
	


Und schon habt ihr eine brauchbare Statusline die nicht mehr ganz so fade aussieht und ihr habt euch ein Plugin gespart.
Die .vimrc ist enrom erweiterbar. Die meisten plugins machen nichts anderes, als Code der in die config passen würde auslagern. Nicht falsch verstehen - Plugins sind cool. Schau ich mir auch noch an - ich hab da schon ne lustige Idee, aber dazu mehr wenn es soweit ist. Als Abschluss pack ich euch hier noch die komplette Statusline noch rein.
Viel Spaß beim hacken eurer Statusline.

0x05 - DIE KOMPLETTE STATUSLINE




.VIMRC
    "STATUSLINE
    set laststatus=2
    set noshowmode
    
    "STATUSLINE MODE
    let g:currentmode={
    	\ 'n' : 'NORMAL ',
    	\ 'v' : 'VISUAL ',
    	\ 'V' : 'V-LINE ',
    	\ "\" : 'V-BLOCK' ,
    	\ 'i' : 'INSERT ',
    	\ 'R' : 'R ',
    	\ 'Rv' : 'V-REPLACE ',
    	\ 'c' : 'COMMAND ',
    	\}
    
    set statusline=
    set statusline+=%#Icon#
    set statusline+=\  
    set statusline+=\ %#NormalC#%{(mode()=='n')?'\ NORMAL\ ':''}
    set statusline+=%#InsertC#%{(mode()=='i')?'\ INSERT\ ':''}
    set statusline+=%#VisualC#%{(mode()=='v')?'\ VISUAL\ ':''}
    set statusline+=%#Filename#
    set statusline+=\ %f
    set statusline+=%#ReadOnly#
    set statusline+=\ %r
    set statusline+=%m
    set statusline+=%=
    set statusline+=%#Fileformat#
    set statusline+=\ %y
    set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
    set statusline+=\ [%{&fileformat}\]
    set statusline+=%#Position#
    set statusline+=\ [%l/%L]
	




[~] BACK