Vi-Befehlsreferenz: Cookbook

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Beim Bearbeiten von Dateien treten immer wieder gleiche oder ähnliche Aufgaben auf. Für diese Aufgaben gibt es oft einfache Lösungen.

Buchstaben- , Wort- und Zeilentausch[Bearbeiten]

xp Buchstabendreher wie im Wort "nciht" können korrigiert werden, indem der Cursor auf den ersten der zu tauschenden Buchstaben ('c') gesetzt und dann x eingeben wird. Der Buchstabe 'c' wird gelöscht, das Wort "niht" bleibt übrig. Der gelöschte Buchstabe wird mit p hinter dem Cursor wieder eingefügt.
dwwP Der Cursor wird auf das erste Zeichen des ersten zu tauschenden Wortes gesetzt und dann dw eingegeben. Das Wort wird gelöscht. Mit w wird der Cursor zum Anfang des jetzt nächsten Wortes bewegt. Das gelöschte Wort wird mit P vor der aktuellen Cursorposition wieder eingefügt. Für die letzten beiden Worte einer Zeile funktioniert diese Kombination nicht.
ddp Der Cursor wird auf die erste der zu tauschenden Zeilen gesetzt und dann dd eingegeben. Die Zeile verschwindet. Die gelöschte Zeile wird mit p unter der aktuellen Cursorposition wieder eingefügt.

Schreibpositionen schnell ansteuern[Bearbeiten]

ea Am Ende eines Wortes weiterschreiben. e springt an das Ende des Wortes und a fügt nach dem Wort an.
A Am Ende einer Zeile weiterschreiben. A springt an das Ende der Zeile und fügt nach der Zeile an.
wi Am Anfang eines Wortes weiterschreiben. w springt an das erste Zeichen des Wortes und i fügt vor dem Wort ein.
I Am Text-Anfang einer Zeile weiterschreiben. I springt an das erste Zeichen der Zeile und fügt vor der Zeile ein.
|i Am rechten Rand einer Zeile weiterschreiben. | springt an die erste Spalte der Zeile und i fügt vor der Zeile an.
o Unterhalb der aktuellen Zeile weiterschreiben. o öffnet eine neue Zeile unterhalb der aktuellen und fügt dort an.
O Oberhalb der aktuellen Zeile weiterschreiben. O öffnet eine neue Zeile oberhalb der aktuellen und fügt dort an.

Leerzeilen entfernen[Bearbeiten]

:g/^[ ^I]*$/d In der gesamten Datei werden Zeilen (g), die von Anfang (^) bis Ende ($) aus beliebig (*) vielen Space- oder Tabulator-Zeichen ([ ^I]) bestehen, gesucht (/../) und gelöscht (d). ^I wird als Strg-V gefolgt von TAB eingegeben und stellt ein Tabulator-Zeichen dar.
:g/^$/d In der gesamten Datei werden Zeilen (g), die von Anfang (^) bis Ende ($) keine Zeichen (^ gefolgt von $) enthalten, gesucht (/../) und gelöscht (d).

Groß- und Kleinschreibung[Bearbeiten]

:%s/\<./\u&/g Der Anfangsbuchstabe eines jeden Wortes wird zum Großbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für alle Fundstellen in der Zeile (g) durchgeführt: ein beliebiges Zeichen (.) am Beginn eines Wortes (\<) wird ersetzt durch den korrespondierenden Großbuchstaben (\u) zu dem gefundenen Zeichen (&). Dies schließt einzelne Buchstaben ein.
:%s/\<[a-z][a-z]/\u&/g Der Anfangsbuchstabe eines jeden Wortes wird zum Großbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für alle Fundstellen in der Zeile (g) durchgeführt: ein beliebiger Kleinbuchstabe ([a-z]) am Beginn eines Wortes (\<), dem ein weiterer Buchstabe wird ersetzt durch den korrespondierenden Großbuchstaben (\u) zu dem gefundenen Zeichen (&). Dies schließt einzelne Buchstaben aus und alle Wörter mit mehr als zwei Buchstaben ein.
:%s/.*/\L&/ Ersetzt alle Buchstaben durch Kleinbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für die erste Fundstellen in der Zeile durchgeführt: eine beliebige Anzahl (*) beliebiger Zeichen (.) (= ganze Zeile) wird ersetzt durch die in Kleinbuchstaben gewandelte (\L) gefundene Zeichenkette (&) (= ganze Zeile).
:%s/./\l&/g Ersetzt alle Buchstaben durch Kleinbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für alle Fundstellen in der Zeile (g) durchgeführt: ein beliebiges Zeichen (.) wird ersetzt durch den korrespondierenden Kleinbuchstaben (\l) zu dem gefundenen Zeichen (&).

Die Funktionen \u, \U, \l, und \L sind auf vim beschränkt.

HTML-Tags[Bearbeiten]

Jedes HTML-Tag beginnt mit < und endet mit einem >. Damit lässt sich ein einfacher, aber wirkungsvoller Befehl formulieren: :%s/<[^>]*>//g. Also alles was zwischen den < und > erscheint wird gelöscht.

Unix- und DOS-Dateien[Bearbeiten]

Es kommt doch einige Male im Leben eines Benutzers vor, dass dieser unter Unix DOS-Dateien oder unter DOS Unix-Dateien ändert. Die beiden Dateiformate sind sich sehr ähnlich, aber leider nicht identisch. DOS hängt an jedes Zeilenende zwei Zeichen (Carriage Return CR und Line Feed LF), Unix dagegen nur ein Zeichen (LF). Viele Editoren ignorieren dies und zeigen eben nur eine Zeile an oder hängen, wenn sie eine Unix-Datei öffneten, einfach ein CR/LF an jede Zeile an und machen so die Unix-Datei (für manche Programme) unlesbar. Dies kann auch bei einem Versionsmanagementsystem (z.B. CVS) zu Problemen führen, da alle(!) Zeilen geändert wurden. Vi ändert die Datei nicht.

Vi bietet über den Suche- und Ersetzungsmechanismus eine einfache Möglichkeit alle CR-Zeichen zu suchen und eben durch nichts zu ersetzen. Auf die gleiche Weise kann er jedes Zeilenende zusätzlich mit einem CR auszustatten. Die Eingabe eines Sonderzeichens (CR - ASCII 13) erfolgt über Strg-V und dann Strg-M (merke: M ist der 13. Buchstabe). Der Vi zeigt diese Sonderzeichen als ^M an. Bei der Cursornavigation erkennt man, dass dies wirklich nur ein Zeichen ist. Mit diesem Wissen lässt sich der Ausdruck aufschreiben.

Nochmals bitte ^M als Strg-V Strg-M eingeben.

:%s/^M//g

Erläuterung: % bezieht sich auf alle Zeilen in der Datei. Mit s wird der Ersetzungsmechanismus eingeleitet. ^M ist das Suchmuster und mit // wird das ^M eben durch nichts ersetzt. Das g am Ende steht für global und ersetzt alle Vorkommen pro Zeile (bei nur einem CR pro Zeile ist es also hier nicht erforderlich).

Sollen Unix-Dateien in Dos-Dateien umgewandelt werden, dann geschieht dies wiederum über den Ersetzungsmechanismus:

:%s/$/^M/

Erläuterung: Wie oben, jedoch wird vor jedem Zeilenende ($) das ASCII-Zeichen 13 (= CR = ^M) eingefügt. (Eine erneute Eingabe des $-Zeichens nach dem ^M ist nicht erforderlich, da der Unix-Zeilenumbruch (ASCII-Zeichen 10 = LF) automatisch erhalten bleibt.)