Vim Kurzreferenz

17.10.2010

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.

KommandoKürzel fürBeschreibung
:qquitBeendet den Editor
:q!quit!Beendet den Editor und verwirft dabei alle Änderungen
:wqwrite, quitSpeichert die Änderungen und beendet den Editor
:xexitEntspricht :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.

KommandoKürzel fürBeschreibung
:wwriteSpeichert die Änderungen an der Datei ab
:w [Dateiname]writeSpeichert 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 wbrowse for writeSpeichert eine Datei, bietet jedoch vorher einen Dateiselektor an
:browse ebrowse 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:

KommandoKürzel fürBeschreibung
wwordSpringt zum Anfang des nächsten Wortes
^Springt zum Anfang der Zeile
$Springt zum Ende der Zeile
eendSpringt zum Ende des aktuellen Wortes. Wenn der Cursor schon auf einem Wortende steht, zum Ende des nächsten Wortes
bbeginningSpringt rückwärts zum Wortanfang. Wenn der Cursor schon auf einem Wortanfang steht, zum Anfang des vorausgehenden Wortes
GgotoSpringt an das Ende der Datei
[Zeile]GgotoSpringt zur angegebenen Zeile
gggotoSpringt 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:

KommandoKürzel fürBeschreibung
iinsertEinfügen an der Position links vom Cursor
IinsertEinfügen am Anfang der aktuellen Zeile
aappendEinfügen an der Position rechts vom Cursor. Der Cursor wird dabei so versetzt, dass die neuen Zeichen wieder links vom Cursor auftauchen.
AappendAnfügen am Ende der Zeile
oopen new lineEine neue Zeile unterhalb des Cursors einfügen
Oopen new lineEine neue Zeile oberhalb des Cursors einfügen
rreplaceErsetzt das Zeichen unter dem Cursor
cchangeErsetzt 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:

KommandoKürzel fürBeschreibung
dwdelete wordLöscht1 bis zum Anfang des nächsten Wortes (einschließlich der dem aktuellen Wort nachfolgenden Leerzeichen)
dedelete endLöscht1 bis zum Ende des aktuellen Wortes (ohne die nachfolgenden Leerzeichen)
dbdelete beginningLö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
dddelete deleteLöscht1 die gesamte Zeile
dGdelete Goto endLöscht1 die aktuelle Zeile und alle Zeilen bis zum Ende der Datei
dggdelete goto beginningLö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 /.
xextinguishLö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).

KommandoKürzel fürBeschreibung
pputFügt den Inhalt des Puffers rechts vom Cursor ein
PputFü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:

KommandoKürzel fürBeschreibung
uundoMacht die letzte Änderung rückgängig
Uundo lineMacht 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

KommandoKürzel fürBeschreibung
:[range]s/[von]/[nach]/search replaceErsetzt im angegebenen Bereich ("[range]") das erste Vorkommen von “[von]” durch “[nach]”.
:[range]s/[von]/[nach]/gsearch replace globalErsetzt im angegebenen Bereich ("[range]") das alle Vorkommen von “[von]” durch “[nach]”.

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

RangeSuchbereich
(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:

KommandoBeschreibung
*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:

KommandoBeschreibung
:![Kommando]Kommando auf der Shell ausführen
:shÖffnet eine Shell
:makeFü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:

KommandoKürzel fürBeschreibung
Strg+wStrg+wWindowWechselt in das nächste Fenster
Strg+w=Macht alle Fenster etwa gleich groß
Strg+w_Maximiert das aktuelle Fenster (horizontal)
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

KommandoKürzel fürBeschreibung
:tabe [Datei]tab editÖffnet ein neues Tab zum Bearbeiten der angegebenen Datei.
:tabctab closeSchließt das aktuelle Tab
:tabntab nextWechselt auf das nächste Tab
:tabptab previousWechselt auf das vorhergehende Tab
:tabn [Nummer]tab nextWechselt 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.

OptionBeschreibung
rulerBlendet die aktuelle Position des Cursors innerhalb der Datei in der Fußzeile ein
showcmdZeigt das aktuelle Kommando in der Fußzeile an. Sehr praktisch für mehrteilige Kommandos.
showmodeZeigt den aktuellen Modus (Insert, Visual, etc.) in der Fußzeile an.
numberZeigt Zeilennummern in der linken Spalte an
hlsearchHervorheben der Suchergebnisse aktivieren
tabstopLegt die Weite eines Tabs fest. Praktisch, wenn man etwas mehr Übersicht und etwas weniger Einzug haben möchte.
shiftwidthLegt fest, wie weit der <<- und >>-Operator den Text einrückt.
expandtabTabs werden als Leerzeichen eingefügt. Dieser Modus ist nicht immer sinnvoll, kann aber in Konfigurationsdateien, welche keine Tabs verstehen, den Tag retten.
backgroundKann auf light oder dark gesetzt werden. Passt das Farbschema an helle (weiß) oder dunkle (schwarz) Terminalhintergründe an.
scrollbindSynchronisiert 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. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎