Vim Kurzreferenz

Vi ist neben Emacs der Texteditor auf Linux Systemen. Leider ist seine Lernkurve ziemlich steil. Das zeigt sich schon daran, dass Anfänger häufig schon daran scheitern den Editor wieder zu beenden, nachdem sie ihn aus versehen geöffnet haben. Dabei sind Vi und sein Nachkomme Vim (Vi improved) sehr mächtigte Editoren. Daher hier eine (nicht ganz so kurze) Kurzübersicht der wichtigsten Kommandos für Vim.

Modi

Vim kennt - wie auch Vi - drei Modi. Der Editor startet normalerweise im Kommandomodus. In diesem Modus lassen sich die nachfolgend beschriebenen Befehle eingeben. Betätigt man eine, der im Kapitel “Einfügemodus” dargestellten Tasten, landet man im… genau: Einfügemodus. Dieser erlaubt es, Text in das Dokument einzugeben. Da wir ja nicht mehr in den 80er Jahren leben, kann man auch in diesem Modus mit Backspace- und Entf-Taste Text löschen bzw. mit den Pfeiltasten den Cursor bewegen.

Etwas besonderes ist der Visuelle-Modus. Dieser erlaubt es, Text zu selektieren und entspricht in etwa der Shift-Taste in grafischen Editoren. Jedoch lassen sich auch hier alle Kommandos zur Bewegung im Text verwenden. Details hierzu findet man im Kapitel “Visueller Modus”.

Laden, Speichern, Beenden

VIM Laden und Speichern Kommandos

Ich habe versucht die einzelnen VIm-Kommandos möglichst eingängig darzustellen. Kleine Syntaxdiagramme zeigen die verschiedenen Kombinationsmöglichkeiten. In den Tabellen ist in der Spalte “Kürzel für” das Wort angegeben, für welches der Befehl steht. Diese lassen sich nicht verwenden, jedoch kann ich mir die Befehle besser merken, vielleicht geht es Ihnen ähnlich.

Kommando Kürzel für Beschreibung
:q quit Beendet den Editor
:q! quit! Beendet den Editor und verwirft dabei alle Änderungen
:wq write, quit Speichert die Änderungen und beendet den Editor
:x exit Entspricht :wq. Beendet also den Editor und speichert alle Änderungen ab

Wie der Befehl :wq zeigt, lassen sich einzelne Befehle kombinieren. :wq ist quasi die Zusammensetzung aus dem Befehl :w und :q. Das sollte man sich merken, denn auch die Auswahlbefehle lassen sich auf diese Art kombinieren.

Kommando Kürzel für Beschreibung
:w write Speichert die Änderungen an der Datei ab
:w [Dateiname] write Speichert die Änderungen in einer neuen Datei ab
:e [Dateiname] edit Öffnet eine Datei
:split [Dateiname] split window Öffnet eine Datei in einem neuen, horizontal geteilten Fenster
:vsplit [Dateiname] vertical split window Öffnet eine Datei in einem neuen, vertikal geteilten Fenster
:browse w browse for write Speichert eine Datei, bietet jedoch vorher einen Dateiselektor an
:browse e browse for edit Öffnet eine Datei, welche sich über einen Dateiselektor auswählen lässt

Das Kommando :browse w zeigt eine andere Art der vorher erwähnten Kombination von Befehlen. Hier übernimmt der Befehl :browse das Kommando w, welches er ausführt, sobald die Dateiauswahl beendet ist.

Bewegen

Man kann sich nicht nur mit den Pfeiltasten innerhalb des Editors bewegen. Zusätzlich gibt es noch einige Kommandos, welche sich nicht nur zum Bewegen des Cursors als nützlich erweisen:

Kommando Kürzel für Beschreibung
w word Springt zum Anfang des nächsten Wortes
^   Springt zum Anfang der Zeile
$   Springt zum Ende der Zeile
e end Springt zum Ende des aktuellen Wortes. Wenn der Cursor schon auf einem Wortende steht, zum Ende des nächsten Wortes
b beginning Springt rückwärts zum Wortanfang. Wenn der Cursor schon auf einem Wortanfang steht, zum Anfang des vorausgehenden Wortes
G goto Springt an das Ende der Datei
[Zeile]G goto Springt zur angegebenen Zeile
gg goto Springt an den Anfang der Datei

Diese Bewegungsbefehle sollte man sich gut merken. Sie lassen sich nämlich auch mit anderen Befehlen (z.B. d) kombinieren.

Bearbeiten

Einfügemodus

VIM Moduswechselkommandos

Diese Kommandos wechseln in den Einfügemodus und positionieren ggf. den Cursor:

Kommando Kürzel für Beschreibung
i insert Einfügen an der Position links vom Cursor
I insert Einfügen am Anfang der aktuellen Zeile
a append Einfügen an der Position rechts vom Cursor. Der Cursor wird dabei so versetzt, dass die neuen Zeichen wieder links vom Cursor auftauchen.
A append Anfügen am Ende der Zeile
o open new line Eine neue Zeile unterhalb des Cursors einfügen
O open new line Eine neue Zeile oberhalb des Cursors einfügen
r replace Ersetzt das Zeichen unter dem Cursor
c change Ersetzt eine definierte Anzahl von Zeichen (siehe unten)

Bearbeiten mit Puffer

VIM Bewegen, Ausschneiden, Kopieren

Die folgenden Befehle erlauben das Ausschneiden (Löschen), Kopieren und Einfügen von Elementen über den Puffer (die Zwischenablage).

Löschen/Ausschneiden

Das Löschkommando d kann zusammen mit den Bewegungsbefehlen verwendet werden und ermöglicht dann mächtige Löschoperationen:

Kommando Kürzel für Beschreibung
dw delete word Löscht1 bis zum Anfang des nächsten Wortes (einschließlich der dem aktuellen Wort nachfolgenden Leerzeichen)
de delete end Löscht1 bis zum Ende des aktuellen Wortes (ohne die nachfolgenden Leerzeichen)
db delete beginning Löscht1 alle Zeichen links vom Cursor bis zum Anfang des aktuellen Wortes
d^   Löscht1 alle Zeichen links vom Cursor bis zum Anfang der Zeile
d$   Löscht1 alle Zeichen - inkl. dem Zeichen unter dem Cursor - bis zum Ende der Zeile
dd delete delete Löscht1 die gesamte Zeile
dG delete Goto end Löscht1 die aktuelle Zeile und alle Zeilen bis zum Ende der Datei
dgg delete goto beginning Löscht1 die aktuelle Zeile und alle Zeilen bis zum Anfang der Datei
d/[Suchmuster]   Löscht1 alle Zeichen - inkl. dem Zeichen unter dem Cursor - nach rechts bis zum Auftreten des Suchmusters. Das Muster bleibt erhalten. Dieser Befehl ist eine Kombination von delete und dem Suchbefehl /.
x extinguish Löscht1 das Zeichen unter dem Cursor

Das Kommando x gehört eigentlich nicht zu den mit d eingeleiteten Löschkommandos, jedoch passt es thematisch hier am besten hin.

Kopieren

Kopiert wird über das Komando y (yank = herausreißen). Dieses Kommando kann mit allen Erweiterungen des Löschkommandos d kombiniert werden. D.h. yw, ye, yb, y^, y$, yG, ygg, y/[Suchmuster] funktionieren wie gewohnt. Sogar yy (analog zu dd funktioniert um eine ganze Zeile zu kopieren. Beim Einfügen über p wird die Zeile dann unter der aktiven Zeile eingefügt.

Einfügen

Eingefügt wird der Inhalt des Puffers über das Kommando p (put).

Kommando Kürzel für Beschreibung
p put Fügt den Inhalt des Puffers rechts vom Cursor ein
P put Fügt den Inhalt des Puffers links vom Cursor ein

Ersetzen

Über das Kommando c (change) können einzelne Wörter oder ganze Satzteile ersetzt werden. Das Kommando lässt sich mit allen Erweiterungen des Löschkommandos d kombinieren. D.h. cw, ce, cb, c^, c$, cG, cgg, c/[Suchmuster] funktionieren wie gewohnt. Sogar cc (analog zu dd funktioniert um eine ganze Zeile zu ändern.

Ich finde die Kompatibilitätsoption $ sehr hilfreich. Hierdurch bleibt beim c-Kommando der überschriebene Text stehen und es wird ein $-Zeichen am Ende des überschriebenen Bereichs angezeigt. Am Ende des Bereichs wird der folgende Text automatisch weitergeschoben. Hierdurch sieht man, was man überschreibt. Aktiviert wird diese Option durch :set cpoptions+=$.

Zeilen zusammenfügen

Das Kommando J (join) fügt die aktuelle und die nächste Zeile zusammen. Das ist besonders hilfreich, wenn man mal wieder aus Versehen einen Zeilenumbruch eingefügt hat.

Einrücken

Über das Kommando << und >> lassen sich Zeilen ein- und ausrücken. Die Länge dieser Ein-/Ausrückung wird durch den Parameter shiftwidth festgelegt. Im visuellen Modus lassen sich alle selektierten Zeilen mit nur einem Drücken von < oder > ein-/ausrücken.

Wiederholungen

Den meisten Kommandos kann eine Zahl vorangestellt werden, um die Anzahl der gewünschten Wiederholungen zu markieren. 2dw zum Beispiel löscht zwei Wörter. 2xLöscht die nächsten zwei Zeichen und 2yw würde die nächsten zwei Wörter in den Puffer kopieren.

Undo, Redo

Sollte man einen Fehler gemacht haben, so erlaubt Vim unterschiedliche Rückgängig- und Wiederholen-Operationen:

Kommando Kürzel für Beschreibung
u undo Macht die letzte Änderung rückgängig
U undo line Macht die letzte Änderung an der aktuellen Zeile rückgängig
.   Wiederholt die letzte Operation

Das “Wiederholen”-Kommando kann nicht nur Kommandos sondern auch Eingaben im Insert-Mode wiederholen. Somit können längere Texteingaben leicht nochmals an anderer Stelle ausgeführt werden. Cursorbewegungen werden weder von Undo- noch vom Wiederholen-Kommando erfasst.

Suchen und Ersetzen

Suchen

Mit dem Kommando / wird die Suchfunktion aktiviert. Einfach nach dem / den Suchbegriff eingeben und mit Return bestätigen. Um den nächsten Suchtreffer zu finden wird das Kommando n (next) verwendet.

Ersetzen

VIM Ersetzen

Kommando Kürzel für Beschreibung
:[range]s/[von]/[nach]/ search replace Ersetzt im angegebenen Bereich (“[range]”) das erste Vorkommen von “[von]” durch “[nach]”.
:[range]s/[von]/[nach]/g search replace global Ersetzt im angegebenen Bereich (“[range]”) das alle Vorkommen von “[von]” durch “[nach]”.

Wie die Liste zeigt, unterstützt das “Suchen und Ersetzen”-Kommando unterschiedliche Suchbereiche:

Range Suchbereich
(leer) Wird kein Range angegeben, so bezieht sich die Suche auf die aktuelle Zeile.
% Steht für das gesamte Dokument.
`[von],[bis] Sucht und ersetzt von Zeile “[von]” bis Zeile “[bis]”.

:1,5s/asdf/jklö/g ersetzt also von Zeile 1 bis 5 alle Vorkommen von “asdf” durch “jklö”. Würde man das g am Schluss entfallen lassen, so würde nur das erste Vorkommen ersetzt.

Schnellsuche

Um das Suche nach Worten zu vereinfachen, welche bereits im Dokument vorkommen, bietet Vim noch zwei Schnellsuchbefehle:

Kommando Beschreibung
* Vorwärts nach dem Wort unter dem Cursor suchen
# Rückwärts nach dem Wort unter dem Cursor suchen
% Passende Klammer suchen (siehe unten)
[[ Beginn des aktuellen Abschnitts (Funktion)
]] Ende des aktuellen Abschnitts (Funktion)

Passende Klammer finden

Eine, gerade für Programmierer wichtige, Funktion ist das Finden von Klammerpaaren. Hierfür bietet Vim das Kommando %. Dieses setzt den Cursor auf die zugehörige öffnende bzw. schließende Klammer. Dies funktioniert mit runden, eckigen und geschweiften Klammern.

Kommandos ausführen

Beim Entwickeln von Scripten kann es hilfreich sein, nicht jedes mal den Editor verlassen zu müssen um einen Befehl auf der Kommandozeile auszuführen. Hierfür bietet Vim unterschiedliche Möglichkeiten:

Kommando Beschreibung
:![Kommando] Kommando auf der Shell ausführen
:sh Öffnet eine Shell
:make Führt das Kommando make aus. Der Output von gcc wird gleich verarbeitet und die Fehlermeldungen stehen dann in Vim zur Verfügung.

Visueller Modus

Im visuellen Modus erlaubt es Vim den Text über die Bewegungsbefehle zu selektieren. Danach können Operationen wie d (delete) oder y (yank) ausgeführt werden.

Der visuelle Modus wird über das Kommando v aktiviert. Im visuellen Modus lassen sich alle selektierten Zeilen mit < oder > ein-/ausrücken.

Fenster und Tabs

Fenster

Bevor wir zu den Tabs in Vim kommen, zuerst noch eine kurze Übersicht über die Kommandos, welche das Arbeiten mit mehreren Fenstern erlauben:

Kommando Kürzel für Beschreibung
Strg+w Strg+w Window Wechselt in das nächste Fenster
Strg+w = Macht alle Fenster etwa gleich groß  
Strg+w _ Maximiert das aktuelle Fenster (horizontal)  
{::keys}[Strg]+[w] [ ]{:/} Maximiert das aktuelle Fenster (vertikal)
Strg+w + Verkleinert das aktuelle Fenster (horizontal)  
Strg+w - Vergrößert das aktuelle Fenster (horizontal)  
Strg+w < Verkleinert das aktuelle Fenster (vertikal)  
Strg+w > Vergrößert das aktuelle Fenster (vertikal)  

Mit dem Kommando :new (horizontal) und :vnew (vertikal) lassen sich jederzeit neue Fenster erzeugen.

Tabs

Kommando Kürzel für Beschreibung
:tabe [Datei] tab edit Öffnet ein neues Tab zum Bearbeiten der angegebenen Datei.
:tabc tab close Schließt das aktuelle Tab
:tabn tab next Wechselt auf das nächste Tab
:tabp tab previous Wechselt auf das vorhergehende Tab
:tabn [Nummer] tab next Wechselt auf das Tab mit der Nummer [Nummer]. Das Tab ganz links hat die Nummer 1.

Um mehrere Dateien gleich in mehreren Tabs zu öffnen ist die Kommandozeilenoption -p sehr nützlich.

Wichtige Variablen

Variablen lassen sich über :set [Variable] setzen. Ein Ausrufezeichen nach dem Variablennamen setzt die Option wieder zurück. D.h. :set ruler aktiviert die Option, :set rule! deaktiviert diese. Optionen, welchen Werte zugewiesen werden können (z.B. tabstop oder background), werden wie gewohnt mit einem =-Zeichen verwendet.

Option Beschreibung
ruler Blendet die aktuelle Position des Cursors innerhalb der Datei in der Fußzeile ein
showcmd Zeigt das aktuelle Kommando in der Fußzeile an. Sehr praktisch für mehrteilige Kommandos.
showmode Zeigt den aktuellen Modus (Insert, Visual, etc.) in der Fußzeile an.
number Zeigt Zeilennummern in der linken Spalte an
hlsearch Hervorheben der Suchergebnisse aktivieren
tabstop Legt die Weite eines Tabs fest. Praktisch, wenn man etwas mehr Übersicht und etwas weniger Einzug haben möchte.
shiftwidth Legt fest, wie weit der <<- und >>-Operator den Text einrückt.
expandtab Tabs werden als Leerzeichen eingefügt. Dieser Modus ist nicht immer sinnvoll, kann aber in Konfigurationsdateien, welche keine Tabs verstehen, den Tag retten.
background Kann auf light oder dark gesetzt werden. Passt das Farbschema an helle (weiß) oder dunkle (schwarz) Terminalhintergründe an.
scrollbind Synchronisiert das Scrolling für alle Fenster, in welchen diese Option gesetzt ist. Sehr hilfreich beim Vergleichen von Dateien.

Natürlich werde ich diesen Artikel erweitern, wenn sich herausstellt, dass ich etwas Wichtiges vergessen habe ;)

  1. Jedes Löschkommando kopiert die gelöschten Zeichen in den Puffer. Somit löscht man eigentlich nicht, sondern schneidet immer aus.  2 3 4 5 6 7 8 9 10