Kommandozeilen-Modus

Im Kommando-Modus können sowohl Vim-Befehle als auch externe Systembefehle aufgerufen werden.

Ausgehend vom Normalmodus gelangt man mittels : in den Kommandozeilen-Modus, mittels Esc wieder zurück.

Buffer einlesen

Eine neue Datei kann mit :e geoffnet werden, wobei die bisherige Datei im Hintergrund geladen bleibt.

:e dateiname eine Datei öffnen bzw. neu erstellen
:e % die aktuelle Datei neu laden

Der Inhalt einer anderen Datei kann mittels :r hinter der momentanen Cursor-Position eingefügt werden:

:r dateiname Inhalt einer Datei vor dem Cursor einfügen

Buffer wechseln

Um Vim zu beenden oder einzelne Dateien bzw. Fenster zu schließen, gibt man folgendes ein:

:q Schließe den aktuellen Buffer schließen (und beende Vim, falls nur ein Fenster offen ist)
:qa Schließe alle Buffer, beende Vim
:q! Schließe den aktuellen Buffer, verwerfe ungespeicherte Änderungen
:w Speichere Änderungen an der aktuellen Datei
:wq Speichere die aktuelle Datei und schließe den Buffer
:w Dateiname Speichere den aktuellen Buffer als Dateiname

In Vim können mehrere Dateien auf einmal geoffnet sein. Im Umgang mit diesen sogenannten “Buffern” sind folgende Befehle hilfreich:

:ls Zeige eine Liste an geöffneten Dateien an (identisch mit :buffers)
:bn Gehe zur nächsten offenen Datei (buffer next)
:bp Gehe zur vorherigen offenen Datei (buffer previous)
:bf Gehe zur ersten geöffneten Datei (buffer first)
:bl Gehe zur letzten geöffneten Datei (buffer last)
:b 1..99 Gehe zur Datei Nr. 1..99 der Bufferliste  
:bd Lösche die aktuelle Datei aus der Buffer-Liste (buffer delete)

Mittels :bufdo kann man (einen oder mehrere mittels | (“Pipe”) verknüpfte) Befehl(e) auf alle geöffneten Dateien loslassen:

:bufdo Kommando Führe ein Kommando in allen geöffneten Buffern aus

Das Gleiche kann man allerdings auch (meist sicherer) mittels einer Makro-Aufzeichnung erreichen.

Externe Befehle

Externe Programme können im Kommando-Modus integriert werden, indem dem jeweiligen Aufruf ein ! vorangesetzt wird, wie zum Beispiel:

:ls Zeige eine Liste der geoffneten Buffer an (Vim-interne Funktion!)
:!ls Gebe den Inhalt des Arbeitsverzeichnisses aus (gewöhnlicher Linux-Befehl)
:.!sh Ersetze die momentane Zeile (.) durch die Rückgabe der Shell

Wird ein beliebiger Bereich vor dem Ausrufezeichen angegeben (z.B. % für die gesamte Datei oder . für die aktuelle Zeile), so wird die Rückgabe des aufgerufenen Befehls an entsprechender Stelle in die Datei geschrieben.

Für längere derartige Aufrufe können natürlich wiederum in der Konfigurationsdatei entsprechende Mappings vergeben werden. Danach genügt im Normal- oder Einfügemodus ein individuelles Tastenkürzel, und der dadurch definierte Prozess wird ausgeführt.

Ebenso ist es möglich, externe Kommandos nur auf einen bestimmten Bereich (z.B. im visuellen Modus) anzuwenden:

'<,'> !sort Sortiere den visuell markierten Bereich ('< bis '>)
'a,'b !grep Wort Lösche alle Zeilen zwischen den Markern a und b, die nicht Wort enthalten
:r !grep "Test" Datei Lese die Ausgabe von grep ein und füge sie nach der aktuellen Stelle in die Datei ein

Das externe Kommando muss also nicht an erster Stelle in der Kommandozeile erscheinen.

Text ersetzen

Gezieltes Ersetzen von Text erfolgt in Vim nach folgendem Schema:

:Bereich s/Suchbegriff/Ersetzung/Optionen

Als Optionen stehen dabei zur Verfügung:

c Frage bei jedem Treffer nach (confirmation)
g Beachte alle Vorkommen des Suchbegriffs (nicht nur den ersten Treffer in jeder Zeile) (global)
i Ignoriere Groß- / Kleinschreibung (ignore case)

Wird der Befehl auf einen visuell markierten Bereich angewandt, so werden dessen Grenzen '<, '> als Bereich angenommen. Ansonsten kann jeder beliebige Zeilenbereich, mit Komma getrennt, angegeben werden. Möchte man Ersetzungen in der ganzen Datei vornehmen, so steht dafür % als Auswahlbereich zur Verfügung.

Beispiel:

:% s/alt/neu/g Ersetze alt durch neu in der ganzen Datei
:1,20 s/alt/neu/g Ersetze alt durch neu in den ersten 20 Zeilen

Kommt der Schrägstrich selbst im Suchbegriff vor, kann auch jedes andere Zeichen zur Trennung von Suchbegriff, Ersetzungen und Optionen gewählt werden. Das erste Zeichen nach dem s wird dann als Trennzeichen verwendet (z.B. :%s #/pfad/#irgendwas# ).

Reguläre Ausdrücke

Das Suchen und Ersetzen von Textstücken lässt sich durch so genannte reguläre Ausdrücke oft wesentlich erleichtern bzw. beschleunigen. Hierzu können spezielle Zeichen verwendet werden, die jeweils einem bestimmten Suchmuster entsprechen.

Werden die folgenden Zeichen in einem Such- oder Ersetzungsbefehl verwendet, so werden sie als reguläre Ausdrücke interpretiert. Möchte man das jeweilige Zeichen in seiner Grundbedeutung interpretiert haben, so muss ein \ (Backslash) davor platziert werden:

\ Sonderbedeutung des nächsten Zeichens aufheben (“\” entspricht einem Backslash)
^ Zeilenanfang
$ Zeilenende
\r Zeilenende (carriage return)
\t Tabulator
. Ein beliebiges Zeichen
* Multiplexer: Das vorhergehende Zeichen null mal oder beliebig oft
[ ] Selektierer: Eines der Zeichen innerhalb der eckigen Klammern
[^  ] Selektierer mit Negation: Ein Zeichen, das nicht in der eckigen Klammer vorkommt
& Nur im Ersetzungsbereich: Textstelle, auf die das Suchmuster zutrifft.

Ebenso gibt es Zeichen, die in einem Such- oder Ersetzungsbefehl als “normale” Zeichen interpretiert werden, jedoch durch Voranstellen eines \ eine Sonderbedeutung bekommen:

\< Wortanfang
\> Wortende
\(   \) UND-Verknüpfung: Gruppierung mehrer Suchmuster zu einem Ausdruck
\| ODER-Verknüpfung: Der links oder der rechts von \| stehende Ausdruck
\_. Ein beliebigs Zeichen, auch Zeilenende-Zeichen (Suche über Zeilenumbrüche hinweg)
\+ Multiplexer: Das vorhergehende Zeichen einmal oder beliebig oft.
\? Multiplexer: Das vorhergehende Zeichen null oder ein mal.