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
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
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
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. 2x
Lö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
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+wStrg+w | Window | Wechselt 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
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 ;)