Bedienung

Vim wird meist komplett über die Tastatur gesteuert. Damit es bei einer begrenzten Anzahl an Tasten möglich ist schnell durch Dateien zu navigieren, Text einzugeben sowie Editierbefehle auszuführen, wurden verschiedene Ebenen („Modi“) eingeführt. Je nach aktivem Modus haben die Tasten verschiedene Bedeutungen.

  • Beim Start von Vim befindet man sich im Normalmodus.
  • In einen anderen Modus gelangt man durch Drücken einer entsprechenden Taste.
  • Durch Drücken von ESC gelangt man in den Normalmodus zurück.

Um Vim zu beenden, kann man im Normalmodus ZQ (schließen, Änderungen verwerfen) beziehungsweise ZZ (schließen, Änderungen speichern) eingeben.

Einfügemodus

Der Einfügemodus dient – wie der Name schon sagt – zum Einfügen von Text in die aktuelle Datei. Hier gleicht Vim einem „normalen“ Editor: Alle Buchstaben, Zahlen, etc. erscheinen nach der Eingabe an der aktuellen Position auf dem Bildschirm.

Ausgehend vom Normalmodus gelangt man in den Einfügemodus durch Drücken einer der folgenden Tasten:

i Text einfügen vor der momentanen Position (insert)
I Text einfügen zu Beginn der momentanen Zeile  
a Text einfügen nach der momentanen Position (append)
A Text einfügen am Ende der momentanen Zeile  
o Text einfügen unter der aktuellen Zeile (open a new line)
O Text einfügen über der aktuellen Zeile  

Auch mit s, S, c, C, r, R gelangt man in den Einfügemodus. Hierbei wird jedoch bestehender Text ersetzt.

Gibt man beispielsweise 10i gefolgt von etwas Text ein, so wird nach Beenden der Eingabe mit Esc das 10-fache des eingegebenen Textes eingefügt.

Im Einfügemodus gibt es standardmäßig folgende Tastenkombinationen:

Ctrl n bzw. Ctrl p Vervollständigung des aktuellen Wortes anhand eines bereits vorkommenden Wortes (next bzw. previous word)
Ctrl x  Ctrl l Vervollständigung der aktuellen Zeile anhand einer bereits vorkommenden Zeile (line-completion)
Ctrl x  Ctrl f Vervollständigung der Eingabe von Dateinamen und Pfaden (file-completion)

Snippets

Durch die Verwendung von so genannten „Snippets“ kann viel Tipparbeit gespart werden. Das Prinzip hierbei ist sehr einfach: Man definiert sich frei wählbare Abkürzungen, die dann nach einem Drücken der Tab-Taste (oder einer anderen frei wählbaren Taste) ein ganzes Template ausrollen können, so dass nur noch an einzelnen Stellen Text eingefügt werden muss.

Das meiner Meinung nach beste Snippet-Plugin ist Ultisnips; man kann damit je nach Dateityp beziehungsweise Endung einer Datei unterschiedliche Abkürzungen definieren. Die Abkürzungen liegen allesamt in einem gemeinsamen Ordner und sind jeweils mit dateityp.snippets benannt. Beispielsweise kann man sich so sowohl für C-Dateien als auch für Python-Dateien je ein Snippet mit der Abkürzung ife definieren, das dann nach einem Drücken der Tab-Taste im jeweiligen Dateityp eine if-else-Abfrage mit Sprungmarken zu den jeweiligen Eingabestellen erstellt.

Besonders praktisch sind Snippets für ein Arbeiten mit LaTeX -Dateien: So kann man beispielsweise ein Snippet namens art definieren, das eine gesamte Standard-Präambel für die Dokumentklasse article definiert. So genügt es dann, eine leere .tex-Datei zu öffnen, im Einfügemodus art und Tab einzugeben, und man kann bereits mit dem Schreiben des eigentlichen Dokuments beginnen. :-)

Snippets-Beispieldateien:

Normalmodus

Der Normalmodus dient der Navigation durch die geöffnete(n) Datei(en) und der Bearbeitung von deren Inhalt. Jede Taste besitzt hier ihre eigene Funktion. Ein Spickzettel kann in der Lernphase hilfreich sein!

Eigene Zuweisungen von beliebigen Funktionen auf Tasten(kombinationen) lassen sich mittels Mappings definieren.

Bewegen

Die folgenden Tasten(kombinationen) bewirken im Normalmodus eine Bewegung des Cursors.

hjkl kann alternativ zu den Pfeiltasten genutzt werden:

j \downarrow Gehe eine Zeile nach unten
k \uparrow Gehe eine Zeile nach oben
h \leftarrow Gehe eine Stelle nach links
l \rightarrow Gehe eine Stelle nach rechts

Ctrl f und Ctrl b entsprechen PageDOWN und PageUp:

Ctrl f oder PageDOWN Gehe eine Seite nach unten
Ctrl b oder PageUP Gehe eine Seite nach oben

Um zu einer bestimmten Zeile zu gelangen, gibt es folgende Tastenkürzel:

gg Gehe zum Anfang der Datei
G Gehe ans Ende der Datei

Mit der Eingabe von nG oder ngg springt man zur n-ten Zeile. Beispielsweise gelangt man durch die Eingabe von 3gg beziehungsweise 3G zur dritten Zeile.

Mit 0 und $ gelangt man schnell an den Anfang oder das Ende der aktuellen Zeile. Einzelne Buchstaben lassen sich gezielt mit f und t ansteuern:[1]

^ oder 0 Gehe an den Anfang der Zeile
$ Gehe an das Ende der Zeile
f Buchstabe Gehe zu dem nächsten Vorkommen von Buchstabe (exakt)
F Buchstabe Gehe zu dem vorherigen Vorkommen von Buchstabe (exakt)
t Buchstabe Gehe zu dem nächsten Vorkommen von Buchstabe (eine Stelle vorher)
T Buchstabe Gehe zu dem vorherigen Vorkommen von Buchstabe (eine Stelle vorher)
; (Strichpunkt) Wiederhole die letzte Buchstabensuche in gleicher Richtung
, (Komma) Wiederhole die letzte Buchstabensuche in umgekehrter Richtung

Um von einem Wort zum nächsten zu gelangen, gibt es folgende Tastenkürzel:

w Gehe an den Anfang des nächsten Wortes W wie w, jedoch ohne Rücksicht auf Satzzeichen
e Gehe an das Ende des aktuellen Wortes E wie e, jedoch ohne Rücksicht auf Satzzeichen
b Gehe an den Anfang des vorherigen Wortes B wie b, jedoch ohne Rücksicht auf Satzzeichen
ge Gehe an das Ende des vorherigen Wortes    

Für Sprünge zum nächsten beziehungsweise vorherigen Satz oder Abschnitt lassen sich die Klammer-Symbole verwenden:

( Gehe an den Anfang des aktuellen Satzes ) Gehe an den Anfang des nächsten Satzes
{ Gehe zu der vorherigen leeren Zeile } Gehe zu der nächsten leeren Zeile
[[ Gehe zu der vorherigen Überschrift ]] Gehe zu der nächsten Überschrift

Innerhalb des aktuellen Bildschirms kann man sich wie folgt bewegen:

H Gehe zu der obersten Zeile des Bildschirms
M Gehe zu der mittleren Zeile des Bildschirms
L Gehe zu der untersten Zeile des Bildschirms

Hierbei gelangt man mit z.B. 5H zur fünften Zeile des aktuellen Bildschirms, mit 2L zur vorletzten.

Manchmal (z.B. beim Aufnehmen von Makros) finden auch folgende Tasten Verwendung:

+ Gehe zum ersten Zeichen der folgenden Zeile
- Gehe zum ersten Zeichen der vorherigen Zeile
n| Gehe zum n-ten Zeichen der aktuellen Zeile
gm Gehe zur Fenstermitte (horizontal)
% Gehe zum passenden Gegenstück einer Klammer
Ctrl d Gehe eine halbe Seite nach unten
Ctrl u Gehe eine halbe Seite nach oben
Ctrl e Scrolle den Bildschirm eine Zeile nach oben (der Cursor bleibt unverändert)
Ctrl y Scrolle den Bildschirm eine Zeile nach unten (der Cursor bleibt unverändert)
zt Scrolle den Cursor an das obere Ende des Bildschirms
zb Scrolle den Cursor an das untere Ende des Bildschirms
zz Scrolle den Cursor in die Mitte des Bildschirms

Weitere Navigationsmöglichkeiten

Folgende Tastenkombinationen sind im Normalmodus ebenfalls oftmals hilfreich:

gf Öffne die Datei unter dem Cursor
gx Öffne den Link unter dem Cursor im Standard-Webbrowser (beispielsweise Firefox)

Beide Tastenkombinationen funktionieren nur, wenn sich der Cursor aktuell über einem existierenden Dateipfad oder einer Web-Adresse befindet.

Suchen

Im Normalmodus kann man mit / beziehungsweise ? die aktuelle Datei vorwärts beziehungsweise rückwärts nach Textstellen durchsuchen:

/ Suchbegriff Gehe zu dem nächsten Vorkommen von Suchbegriff
? Suchbegriff Gehe zu dem vorherigen Vorkommen von Suchbegriff
* Gehe zu dem nächsten Vorkommen des Worts unter dem Cursor
# Gehe zu dem vorherigen Vorkommen des Worts unter dem Cursor
gd Gehe zu dem ersten Vorkommen des Worts unter dem Cursor (go [to the] definition)

Ist die Option hlsearch in der Konfigurationsdatei gesetzt, so werden die Treffer farblich hervorgehoben. Mittels :nohl („no-highlight“) oder einem entsprechenden Mapping kann die Hervorhebung wieder aufgehoben werden.

Zu dem jeweils nächsten Treffer gelangt man mit n:

n Gehe zum nächsten Treffer
N Gehe zum nächsten Treffer (umgekehrte Richtung)

Mit gD kann auch nach einer globalen Definition (in allen geöffneten Buffern gesucht werden.

Bearbeiten

Im Normalmodus gibt es folgende Anweisungen, um Text zu kopieren, löschen, abzuändern, oder einzufügen:

y Kopieren (yank)
d Löschen bwz. Ausschneiden (delete)
c Ändern (change)
p Einfügen (paste)

Damit lassen sich beliebige Mengen an Text bearbeiten:

Text kopieren ändern löschen
wortweise vorwärts yw cw dw
wortweise rückwärts yb cb db
bis zum Zeilenanfang y0 c0 d0
bis zum Zeilenende y$ c$ oder C d$ oder D
die ganze Zeile yy cc dd

Tip: Mir erscheint es logisch, mit Y alles bis zum Zeilenende zu kopieren. Da dies nicht standardmäßig der Fall ist, habe ich mir ein eigenes Mapping in der Konfigurationsdatei so definiert.

Natürlich lassen sich die Anweisungen wieder beliebig multiplizieren, c3W oder 3cW ändert die nächsten drei Wörter ohne Rücksicht auf Satzzeichen, y3y oder 3yy löscht die nächsten drei Zeilen. Bei umfassenderen Textmengen empfiehlt es sich, diese zuerst im visuellen Modus zu markieren, und dann die entsprechende Taste für die gewünschte Bearbeitungsfunktion zu drücken.

Will man nur einzelne Buchstaben oder Ziffern abändern, so kann man folgende Funktionen nutzen:

x Lösche das Zeichen unter dem Cursor  
~ Ändere Kleinbuchstaben in Großbuchstaben und umgekehrt  
gu Ändere Buchstaben in Kleinbuchstaben (auch visuell markierte Bereiche)  
gU Ändere Buchstaben in Großbuchstaben (auch visuell markierte Bereiche)  
r Ändere das Zeichen unter dem Cursor, danach weiter im Normal-Mode (replace)
R Überschreibe eine beliebige Anzahl an Zeichen („Replace“-Mode, zurück mit ESC)  
s Ändere das Zeichen unter dem Cursor, weiter im Insert-Mode (substitute)
S Ändere die ganze Zeile  

Bei jeder Bearbeitungsanweisung wird der entsprechende Textteil in die Zwischenablage kopiert. Von dort aus kann er mittels p wieder eingefügt werden:

p Füge Inhalt des Zwischenspeichers hinter dem Cursor ein
P Füge Inhalt des Zwischenspeichers vor dem Cursor ein

Im Einfügemodus kann Text aus der systemweiten Zwischenablage mittels Shift Insert (Einfüge-Taste) oder durch Klick auf die mittlere Maustaste (gleichzeitiges Klicken von linker und rechter Taste bei zweitastigen Mäusen und Notebooks) eingefügt werden.

Im Normalmodus kann Text aus der systemweiten Zwischenablage mittels des Registers * genutzt, also mittels "*p beziehungsweise "*P eingefügt werden.

Undo und Redo

Änderungen können mit u rückgängig gemacht beziehungsweise mit Ctrl r wiederhergestellt werden:

u Mache die letzte Änderung rückgängig (undo)
U Mache alle Änderungen in der aktuellen Zeile rückgängig  
Ctrl r Stelle eine rückgängig gemachte Änderung wieder her (redo)
. Wiederhole die zuletzt getätigte Texteingabe, Textbearbeitung, Formatierung, etc.  

Marker

Muss man öfters innerhalb einer Datei hin- und herspringen, so schaffen Markierungshilfen (Marker) Abhilfe.

Im Normalmodus kann man die Stelle, an der sich der Cursor gerade befindet, mit m gefolgt von einem beliebigen Buchstaben markieren:

m Kleinbuchstabe Setze eine lokale Markierung (gilt nur in der aktuellen Datei)
m Großbuchstabe Setze eine globale Markierung

Mit Hilfe der globalen Markierungen lassen sich häufig genutzte Dokumente schnell laden, egal wo man sich gerade befindet.

Beispiel: Man kann man mit 'G zu genau der Stelle wechseln, die man vorhergehend mit mG markiert hat. Liegt der Marker dabei in einer anderen Datei, so bleibt der ursprüngliche Buffer im Hintergrund geöffnet (ein Wechsel zwischen den geöffneten Dateien ist beispielsweise mit dem Minibuf-Explorer-Plugin leicht möglich).

Mit ' (einfaches Anführungszeichen), gefolgt von dem angegebenen Buchstaben, gelangt man von wieder zu der entsprechenden Zeile, mittels ` (Apostroph) sogar in die entsprechende Spalte. Mittels '' beziehungsweise `` gelangt man zur zuletzt bearbeiteten Zeile beziehungsweise Position zurück.

Tipp: Mittels '. gelangt man zu der zuletzt editierten Stelle, mit '^ zur letzten Einfüge-Stelle, und mit '" zur Position beim letzten Beenden zurück!

Ein weiteres Springen zwischen verschiedenen Änderungen und deren Positionen ist mittels Ctrl o beziehungsweise Ctrl i möglich:

Ctrl o Gehe zurück zur letzten Änderung (beziehungsweise zur zuletzt geänderten Datei)
Ctrl i Gehe vorwärts zur letzten Änderung (umgekehrte Richtung)

Ctrl o beziehungsweise Ctrl i können auch mehrfach hintereinander gedrückt werden, um weiter zurück beziehungsweise vor in der Positions-History zu springen.

Register

Vim besitzt nicht nur eine Zwischenablage, sondern kann Textelemente und Makros jedem beliebigen Kleinbuchstaben zuweisen. Ein Register ist quasi eine benannte Zwischenablage.

Im Normalmodus kann man mit " Buchstabe auf einen Register zugreifen:

" Kleinbuchstabe Bearbeitungsanweisung Kopiere in/aus das Register Buchstabe hinein/heraus
" Großbuchstabe Bearbeitungsanweisung Füge Text oder Code hinten an das Register Buchstabe an

Beispiel: Mittels "hyy kann die aktuelle Zeile in die Ablage h kopiert werden. Deren Inhalt kann mit "hp wieder an anderer Stelle eingefügt werden. So abgelegte Inhalte bleiben auch beim Schließen von Vim erhalten!

Mit :reg erhält man eine Übersicht, welcher Inhalt in welchem Register abgelegt ist:

:reg Zeige den Inhalt aller Register an

Die normale, Vim-interne (namenlose) Zwischenablage kann explizit über das Register " angewählt werden. Ein anderes, spezielles Register ist die systemweite Zwischenablage *, mittels der ein Kopieren von beziehungsweise in andere(n) Programme(n) möglich ist:

"*y Bewegung Kopiere in die Zwischenablage
"*p Bewegung Füge aus der Zwischenabage ein

Eine weitere systemweite Zwischenablage ist ~, in welcher der zuletzt mit der Maus ausgewählte Text abgespeichert ist.

Unter Linux werden Bereiche bereits durch ein einfaches Markieren (Visueller Modus) in die systemweiten Zwischenablagen kopiert. An anderer Stelle können sie dann mit Shift Ins (Einfüge-Taste) oder durch einen Klick auf die mittlere Maustaste wieder eingefügt werden.

Auch im Einfüge- und im Kommandozeilenmodus kann auf die Inhalte der einzelnen Register zugegriffen werden: Durch eine aufeinander folgende Eingabe von <c-r> und einem Registerbuchstaben beziehungsweise -Symbol wird der Inhalt des entsprechenden Registers an der Cursorposition eingefügt:

<c-r>" Füge den Inhalt des namenlosen Registers an der Cursorpostition ein
<c-r>% Füge den aktuellen Dateinamen (Register %) an der Cursorposition ein
<c-r>a, <c-r>b usw. Füge den Inhalt des Registers a, b, usw. an der Cursorposition ein

Weitere Informationen über die verschiedenen Register aus den Vim-Hilfeseiten können mittels :h <c-r> aufgerufen werden.

Makros

Es kann nicht nur Text in einem Register abgelegt werden, sondern auch jede beliebige Anweisungssequenz. Wie bei einem Kassettenrecorder können Anweisungen mit aufgezeichnet, und als „Makro“ später beliebig oft wieder abgespielt werden:

Im Normalmodus werden Makros mit q Buchstabe aufgezeichnet und mit @ Buchstabe wiedergegeben:

q Kleinbuchstabe Nehme eine Anweisungssequenz bis zum nächsten Drücken von q auf
q Großbuchstabe Hänge eine Anweisungssequenz an das Register Buchstabe an
@ Buchstabe Führe die im Register Buchstabe liegende Anweisungssequenz aus

Es kann durchaus nützlich sein, z.B. mittels 10@Buchstabe eine Anweisungskette 10fach auszuführen. Speziell gleichförmige Bearbeitungen mehrerer Dateien sind so möglich, denn Bufferwechsel können ja gleich mit „aufgenommen“ werden.. :-)

Tipp: Der zuletzt ausgeführte Makro-Anweisung kann mit @@ wiederholt werden.

Faltungen

Werden Text-Dateien infolge ihrer Länge zu unübersichtlich, können bestimmte Bereiche ausgeblendet werden. Das kann entweder über Schlüsselworte, Einrückungen oder über Symbole erfolgen.

Beispielsweise wird Python-Code häufig anhand von Einrückungen gefaltet, in Datei-Vergleichen mittels diff werden gleiche Textbereiche weggefaltet, so dass nur die Unterschiede in den Dateien sichtbar bleiben. Wird kein spezieller Faltungsmechanismus von einem Plugin geladen, so wird das in der Konfigurationsdatei festgelegt Faltungsschema verwendet. Oft werden dabei als Faltungsmarkierungen {{{ und }}} genutzt, so dass alle Textbereiche, die sich zwischen solchen Dreifach-Klammern befinden, gefaltet werden.

Folgende Anweisungen können im Umgang mit Faltungen nützlich sein:

zf Erstelle eine Faltung  
zo Öffne eine Faltung (open)
zc Schließe eine Faltung (close)
zd Entferne eine Faltung (delete)
\rf Falte die Datei neu (refold)

Um eine Faltung zu erstellen, wird der Bereich meist zuerst visuell markiert, und dann mittels zf gefaltet.

Faltungen können auch ineinandergeschachtelt (nested) auftreten. Faltungen unter dem Cursor können einzeln oder auf einmal mittels za beziehungsweise zA geöffnet und geschlossen werden.

za Öffne beziehungsweise schließe lokale Faltungen
zA Öffne beziehungsweise schließe lokale Faltungen (rekursiv)

Ebenfalls nützlich sind folgende Faltungsanweisungen:

zr Reduziere die Anzahl der Faltungsebenen um eins (reduce)
zm Erhöhe die Anzahl der Faltungsebenen um eins (more)
zR Öffne alle Faltungen  
zM Schließe alle Faltungen  

Persönlich habe ich mir in der Konfigurationsdatei mittels nmap <space> za ein Mapping definiert, das beim Drücken der Leertaste za aufruft, und damit die aktuelle Textebene faltet oder aber , falls man sich mit dem Cursor über einer Faltung befindet, diese wiederum öffnet.

Fenster splitten

Vim kann mehrere Dateien optional in verschiedenen Tabs im oder in unterteilten Fenstern öffnen:

  • Mit :tabedit datei wird eine Datei in einem neuen Tab geöffnet. Zwischen den Tabs kann mit Ctrl PageUP und Ctrl PageDOWN gewechselt werden. Infos findet man beispielsweise unter :h tabpage.txt.[2]
  • Mit :[v]split beziehungsweise Ctrl W s oder Ctrl W v wird ein Fenster horizontal beziehungsweise vertikal geteilt. Manche Plugins wie Minibuf-Explorer oder Tagbar nutzen diese Funktion, um auf der linken Seite beispielsweise ein Inhaltsverzeichnis ein- oder auszublenden.

Anweisungen zur Handhabung von geteilten Fenstern werden gewöhnlich mit Ctrl W eingeleitet. Mit folgenden Tastenkombinationen kann man zwischen den geöffneten Fenstern wechseln:

Ctrl W w Wechsle zum jeweils nächsten Fenster (im Uhrzeigersinn)
Ctrl W h j k l Wechsle man zum nächsten Fenster auf der linken, unteren, oberen oder rechten Seite
Ctrl W H J K L Verschiebe das aktuelle Fenster in die jeweilige Richtung
Ctrl W r bzw. Ctrl W R Verschiebe alle geöffnete Fenster der Reihenfolge nach, das letzte wird das erste

Mit folgenden Anweisungen lässt sich die Größe des aktuellen Fensters anpassen:

Ctrl W + Vergrößere das aktuelle Fenster um eine Zeile
Ctrl W - Verkleinere das aktuelle Fenster um eine Zeile
n Ctrl W | Setze die Breite des aktuellen Fensters auf n
Ctrl W _ Maximiere das aktuelle Fenster
Ctrl W = Richte alle Fenster auf die gleiche Größe aus

Zum Schließen des aktuellen beziehungsweise der übrigen Fenster gibt es folgende Tastenkombinationen:

Ctrl W c Schließe das aktuelles Fenster (close)
Ctrl W o Schließe alle anderen Fenster (close other)

Persönlich nutze ich Fenster-Aufteilungen nur, wenn Plugins dies erforderlich machen, beispielsweise das Minibuf-Explorer-Plugin. Ansonsten nutze ich grundsätzlich eigene Buffer, wenn innerhalb einer Vim-Sitzung mehrere Dateien bearbeitet werden sollen.

Quickfixleiste

Nutzt man den Vim als Programmier-Umgebung beziehungsweise compiliert aus dem Vim heraus Quellcode, so bekommt man Fehlermeldungen in der sogenannten „Quickfix-Leiste“ angezeigt. Im Prinzip ist das ein gesplittetes Fenster, in welchem zwischen den Fehlern navigiert werden kann. Durch Drücken von Enter gelangt man an die entsprechende Stelle im Hauptdokument. Von dort aus gelangt man zum nächsten beziehungsweise vorherigen Fehler mittels :cn beziehungsweise :cp.

Gesplittete Fenster werden häufig von Plugins genutzt, um beispielsweise am linken Seitenrand ein Inhaltsverzeichnis oder am unteren einen Buffer-Browser einzublenden.

Vimdiff

Das Linux-Programm vimdiff zeigt ebenfalls in gesplitteten Fenstern Unterschiede zwischen zwei Dateien an. Auf diese Weise lassen sich verschiedenen Versionen des gleichen Dokuments schnell und übersichtlich abgleichen (abweichende Stellen werden automatisch markiert):

vimdiff datei1 datei2

Bewegt man sich in einer Datei nach unten, so scrolled die Anzeige der anderen Datei im gegenüberliegenden Fenster mit, so dass stets die entsprechenden zwei Zeilen verglichen werden. Beide Dateien können editiert werden, der Abgleich erfolgt automatisch.

Such-Modus

Aus dem Normalmodus gelangt man via / in den Suchmodus (beziehungsweise mit ?, wenn man in umgekehrter Richtung suchen möchte). In diesem sowie im Kommando-Modus wird die unterste Zeile des Vim-Fensters als Eingabezeile genutzt.

Der Suchmodus unterstützt von sich aus reguläre Ausdrücke. Beispielsweise kann man folgendermaßen nach Nicht-ASCII-Sonderzeichen suchen:

# Suche nach Nicht-ASII-Zeichen:
/[^\d0-\d127]

Im Suchmodus gibt es nur eine erwähnenswerte Tastenkombination: Drückt man Ctrl r und gibt anschließend eine Register-Bezeichnung an (beispielsweise " für den zuletzt kopierten Text), so wird dieser in die Suchzeile eingefügt. Markiert man eine Textstelle im visuellen Modus und fügt sie mittels y in die Zwischenablage ein, so kann der markierte Inhalt mittels / Ctrl r " in die Eingabezeile übernommen werden. Diese Tastenkombination funktioniert ebenso im Kommando-Modus, kann also sowohl zum Suchen wie auch zum Ersetzen von Sonderzeichen (im Kommando-Modus) nützlich sein.

Kommando-Modus

Im Kommandozeilen-Modus können sowohl Vim-Anweisungen als auch externe Systemanweisungen aufgerufen werden.

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

Buffer öffnen

Eine neue Datei kann mit :edit (oder kurz :e) als neuer Buffer geöffnet werden, wobei die bisherige Datei als eigener Buffer im Hintergrund geladen bleibt. Mit :e kann stets nur eine Datei geöffnet werden; um mehrere Dateien auf einmal zu öffnen, kann :n verwendet werden. Damit können Shell-Wildcards zur Dateien-Auswahl genutzt werden:

:e % die aktuelle Datei (%) neu laden
:e dateiname eine Datei öffnen beziehungsweise neu erstellen
:n file1 file2 *.rst die Dateien file1 und file2 öffnen
:n *.rst alle .rst-Dateien öffnen

Das Zeichen % hat im Kommandozeilen-Modus eine eigene Bedeutung: Es steht für den Namen der aktuell geöffneten Datei. Die Ausgabe von % lässt sich unter anderem folgendermaßen ändern:

% Aktueller Dateiname
%:~ Aktueller Dateiname (relativ zum Home-Verzeichnis)
%:p Aktueller Dateiname (absoluter Pfad)
%:p:h Aktuelles Verzeichnis („Head“ des absoluten Pfads)
%:p:h:h Übergeordnetes Verzeichnis („Head“ des aktuellen Verzeichnisses)
%:p:r Aktueller Dateiname ohne Endung (absoluter Pfad)
%:e Endung der aktuellen Datei

Eine vollständige Beschreibung kann mittels :h filename-modifiers aufgerufen werden.

Der Inhalt einer anderen Datei kann mittels :read (oder kurz :r) hinter der momentanen Cursor-Position eingefügt werden:

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

Buffer speichern und/oder wechseln

Um Vim zu beenden oder einzelne Dateien beziehungsweise 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 oder :x Speichere die aktuelle Datei und schließe den Buffer
:wqa Speichere alle geöffneten Dateien und beende Vim
:w Dateiname Speichere eine Kopie des aktuellen Buffer als Dateiname

Auch die Schreib-Anweisung kann nur auf einen bestimmten Textbereich angewendet werden. Beispielsweise kann man mit :1,25w dateiname die ersten 25 Zeilen der Datei in den angegebenen Dateinamen schreiben, oder man kann einen Text visuell markieren und dabei :w eingeben; in der Kommandozeile wird dabei automatisch '<,'>w angezeigt, wobei '<,'> den visuell markierten Bereich bezeichnet.

In Vim können mehrere Dateien auf einmal geöffnet sein. Im Umgang mit diesen Buffern sind folgende Anweisungen 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# Gehe zur zuletzt verwendeten Buffer  
: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 eine (oder mehrere mittels | („Pipe“) verknüpfte) Anweisung(en) auf alle geöffneten Dateien anwenden:

:bufdo Anweisung Führe eine Anweisung in allen geöffneten Buffern aus

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

Externe Programme aufrufen

Externe Programme können im Kommandozeilen-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öhnliche Linux-Anweisung)
:.!sh Ersetze die momentane Zeile (.) durch die Rückgabe der Shell

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

Die Ausgabe eines externen Programms kann wiederum mittels :r unmittelbar hinter der aktuellen Cursorposition eingelesen werden. Um beispielsweise die Ausgabe von !ls in den Buffer aufzunehmen, kann man folgendes eingeben:

:r !ls

Im Normalmodus kann auch !! anstelle von :! eingegeben werden, um externe Programme aufzurufen.

Externe Programme können unter anderem eingesetzt werden, um die aktuelle Datei zu compilieren. Um beispielsweise eine aktuell geöffnete LaTeX -Datei in ein .pdf-Dokument umzuwandeln, kann man folgendes eingeben:

:!pdflatex %

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 Programme 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 Programm 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 eine dieser Anweisungen 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# ).

Bisweilen ist es auch hilfreich, „seltsame“ Zeichen in einer Textdatei zu ersetzen, beispielsweise wenn Text aus einer .pdf-Datei mittels pdftotext in eine Textdatei extrahiert wird. Die zu löschenden Zeichen können dann visuell markiert und mittels y in die Vim-interne Zwischenablage kopiert werden. In der Kommandozeile kann der so kopierte Inhalt dann mittels <c-r> * wieder eingefügt werden.

Reguläre Ausdrücke

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

Werden die folgenden Zeichen in einer Such- oder Ersetzungsanweisung 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 einer Such- oder Ersetzungsanweisung 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.

Teile eines regulären Ausdrucks, die beim Suchen mittels \( und \) gruppiert werden, können im neuen Ausdruck mittels \1, \2, \3 usw. wieder aufgegriffen werden, wobei beispielsweise \1 den ersten gruppierten Ausdruck bezeichnet. Die Textstelle, die beim Suchen auf den gesamten regulären Ausdruck zutrifft, kann beim Ersetzen mittels \0 referenziert werden.

Weitere Infos zu regulären Ausdrücken in Vim gibt es unter anderem hier, hier und hier.

Visueller Modus

Im visuellen Modus kann Text mittels Bewegungsanweisungen markiert werden, um ihn zu kopieren oder zu bearbeiten.

Aus dem Normal-Modus gelangt man wie folgt in den visuellen Modus:

v „normaler“ visueller Modus  
V zeilenweise visueller Modus (Visual Line)
Ctrl v spaltenweise visueller Modus (Visual Block)

Im normalen visuellen Modus wird der gesamte Textbereich von der aktuellen Position aus bis zu der Stelle, zu der man sich hinbewegt, markiert. Mit o („other“) kann man an das andere Ende des visuell markierten Bereichs gelangen.

Im zeilenweise-visuellen Modus können mit den Navigationsanweisungen { und } oder mit Hilfe von Markierungen leicht ganze Paragraphen oder Textabschnitte kopiert, verschoben oder anderweitig bearbeitet werden. Der blockweise-visuelle Modus bietet speziell mit dem Vim-Plugin Align eine elegante Möglichkeit zur Bearbeitung von Spalten einer Tabelle.

Weiterhin gibt es im visuellen Modus Mappings für folgende Auswahl-Kriterien, die wahlweise mit i („inner“) ohne umgebende Whitespaces oder mit a („outer“) mitsamt umgebenden Whitespaces eingeleitet werden können:

w Ein einzelnes Wort (siehe Option iskeyword)
s Ein einzelner Satz
p Ein einzelner Paragraph (Absatz)
t Ein HTML/XML-Tag
", ', ` Durch Anführungszeichen begrenzter Text
{, [, (, < Durch Klammern begrenzter Text

Gibt man also beispielsweise im visuellen Modus ip ein, so wird der aktuelle Absatz (ohne vorangehende und darauf folgende Leerzeile) ausgewählt; ebenso kann Text innerhalb zwei runder Klammern mit a( inklusive der Klammern ausgewählt werden, wenn sich der Cursor innerhalb der Klammern befindet.

Tip: Jede Bearbeitungsanweisung, die für gewöhnlich eine darauffolgende Bewegungs- oder Auswahlanweisung erwartet, kann auch direkt einen markierten Bereich angewandt werden.

Links


Anmerkungen:

[1]

Bei der aktuellen Version von Vim habe ich feststellen müssen, dass das ,-Mapping mit standardmäßig mitinstallierten Plugin „justify.vim“ kollidiert; man muss, um dies zu beheben, mit SuperUser-Rechten die Datei /usr/share/vim/vim74/pack/dist/opt/justify/plugin/justify.vim editieren und folgende beiden Zeilen durch ein "-Zeichen am Zeilanfang auskommentieren:

" nmap ,gq :%s/\s\+/ /g<CR>gq1G
" vmap ,gq :s/\s\+/ /g<CR>gvgq
[2]Persönlich nutze ich anstelle von Tabs lieber verschiedene Buffer, insbesondere in Kombination mit dem Minibuf-Explorer.