Effiziente Textbearbeitung mit Vim
Dies ist eine deutsche Übersetzung des Artikels Efficient Editing With vim von Jonathan McPherson. Weitere Übersetzungen dieses Artikels gibt es in Französisch (L'édition efficace avec vim), Italienisch (Vim e Gvim: usarli in modo efficiente, und Chinesisch (高效使用vim).
"Für mich ist Vi Zen.
Vi zu benutzen bedeutet Zen zu praktizieren.
Jeder Befehl ist ein Koan.
Tiefgründig für den Benutzer,
unverständlich für den Uneingeweihten.
Jedesmal wenn Du es benutzt entdeckst Du Wahrheit."
--reddy@lion.austin.com
Diese Anleitung setzt grundlegende Kenntnisse von Vim voraus -- Eingabemodus, Befehlsmodus, Laden und Speichern von Dateien etc. Sie ist dafür gedacht Vi Neulingen dabei zu helfen ihre Fertigkeiten zu entwickeln, damit sie Vi effizient benutzen können.
In dieser Anleitung bedeutet <C-X> soviel wie Ctrl-X -- d.h., halte die Ctrl-Taste gedrückt und drücke dann X. Hilfe für die meisten hier verwendeten Befehle bekommt man in Vim indem man :help Befehl eintippt, wobei Befehl das ist wofür Du Hilfe brauchst.
Effizientes Bewegen
Bleib aus dem Eingabemodus draußen
Im Allgemeinen ist es anzuraten so wenig Zeit wie möglich im Eingabemodus zu verbringen, denn in diesem Modus verhält sich Vim wie ein dummer Editor. Darum verbringen die meisten Vim-Neulinge so viel Zeit im Eingabemodus -- es macht Vim einfach in der Handhabung. Vims wirkliche Stärke liegt jedoch im Befehlsmodus! Du wirst feststellen, dass Du umso weniger Zeit im Eingabemodus verbringst je besser Du Dich mit Vim auskennst.
Benutze h, j, k, und l
Der erste Schritt zu effizientem Arbeiten mit Vim ist, sich die Pfeiltasten abzugewöhnen. Einer der Vorteile von Vims modalem Design ist, dass man seine Hände nicht ständig zwischen den Buchstabentasten und den Pfeiltasten hin- und herbewegen muss; im Befehlsmodus entsprechen die Buchstaben h, j, k und l den Richtungen links, unten, oben, und rechts. Man braucht etwas Übung um sich daran zu gewöhnen, aber Du wirst den Geschwindigkeitsvorteil feststellen, sobald Du damit vertraut bist.
Wenn Du E-Mails oder anderen in Absätzen formatierten Text bearbeitest, wirst Du vielleicht feststellen, dass die Richtungstasten mehr Zeilen überspringen als Du erwartest. Das liegt daran, dass Dein Absatz für Vim als eine einzige lange Zeile erscheint. Tippe g vor h, j, k oder l um die Bewegung nach Bildschirmzeilen durchzuführen anstatt nach virtuellen Zeilen.
Benutze Bewegungen um den Cursor in der aktuellen Zeile zu bewegen.
Die meisten Textbearbeitungsprogramme haben nur simple Befehle um den Cursor zu bewegen (links, hoch, rechts, runter, zum Anfang/Ende der Zeile, etc.) Vim hat stark erweiterte Befehle um den Cursor zu bewegen; diese Befehle werden als Bewegung angegeben. Wenn der Cursor von einem Punkt im Text zu einem anderen bewegt wird, wird der Text zwischen den beiden Punkten (inklusive der beiden Punkte selbst) als "übersprungen" betrachtet. (Dies wird später wichtig.)
Hier eine paar wenige der nützlicheren Bewegungen:
| fx | Bewege den Cursor vorwärts (forward) zum nächsten Vorkommen von x in der aktuellen Zeile. (natürlich kann x jedes beliebige Zeichen sein). Dies ist ein extrem nützlicher Befehl. Mit ; kannst Du den letzten f Befehl wiederholen. |
|---|---|
| tx | Genau wie oben, aber bewegt den Cursor genau vor das gesuchte Zeichen, nicht genau darauf. (Das ist sehr nützlich, wirklich.) |
| Fx | Bewegt den Cursor rückwärts zum vorherigen Vorkommen von x in der aktuellen Zeile. |
| w | Bewegt den Cursor ein Wort vorwärts. |
| b | Bewegt den Cursor ein Wort rückwärts. |
| 0 | Bewegt den Cursor an den Anfang der aktuelle Zeile. |
| ^ | Bewegt den Cursor auf das erste Zeichen der aktuellen Zeile. |
| $ | Bewegt den Cursor ans Ende der Zeile. |
| ) | Bewegt den Cursor vorwärts zum nächsten Satz. (Sehr nützlich beim Bearbeiten von E-Mails oder Textdokumenten.) |
| ( | Bewegt den Cursor um einen Satz zurück. |
Bewege Dich effizient durch die Datei.
Vim hat viele Befehle, die Dich innerhalb Deiner Datei dorthin schicken, wo Du hin willst -- nur selten muss man manuell scrollen. Die unten genannten Tastatureingaben sind technisch gesehen keine Bewegungen, da sie der Navigation innerhalb der Datei dienen, anstelle einer bestimmten Zeile.
| <C-F> | Bewege den Cursor eine Bildschirmseite weiter. |
|---|---|
| <C-B> | Bewege den Cursor eine Bildschirmseite zurück. |
| G | Bewege den Cursor ans Ende der Datei. |
| numG | Bewege den Cursor in Zeile num. (Zum Beispiel, 10G geht zu Zeile 10.) |
| gg | Bewege den Cursor an den Anfang der Datei. |
| H | Bewege den Cursor an den oberen Rand des Bildschirms. |
| M | Bewege den Cursor in die Mitte des Bildschirms. |
| L | Bewege den Cursor an den unteren Rand des Bildschirms. |
| * | Lies die Zeichenkette an der Cursorposition und gehe zum nächsten Vorkommen. (Zum Beispiel, wenn Dein Cursor irgendwo im Wort "bob" steht, geht er zum nächsten Vorkommen von "bob" in Deiner Datei.) |
| # | Genauso wie oben, geht jedoch zum vorherigen Vorkommen der Zeichenkette. |
| /text | Suche von der aktuellen Position aus nach dem nächsten Vorkommen von text und geh dort hin. Du musst Enter drücken um die Suche auszuführen. Um die Suche erneut durchzuführen drücke n (für nächstes Vorkommen). |
| ?text | Genauso wie /, sucht aber aber in die entgegengesetzte Richtung. |
| ma | Setze ein Lesenzeichen mit dem Namen a an der aktuellen Cursorposition. Ein Lesezeichen kann als Namen einen beliebigen kleinen Buchstaben haben. Man kann das Lesezeichen nicht sehen, aber es ist da! |
| `a | Gehe zum Lesezeichen a. Wichtig: das ist ein Backtick (auch bekannt als Gravis, Anm. d. Übers.), kein einfaches Hochkomma. |
| `. | Gehe in die Zeile, die zuletzt bearbeitet wurde. Dies ist sehr nützlich! Wenn Du durch die Datei scrollen musstest um etwas nachzuschauen, kannst Du wieder dorthin gehen, wo Du zuletzt warst ohne ein Lesezeichen zu setzen indem Du den `. Befehl benutzt. |
Effiziente Eingabe
Benutze Schlüsselwortvervollständigung
Vim hat ein sehr schönes System zum Vervollständigen von Schlüsselwörtern. Das bedeutet, Du kannst den Teil eines Wortes tippen, eine Taste drücken und Vim vervollständigt das Wort für Dich. Zum Beispiel, wenn Du eine Variable mit dem Namen ichBinEinLangerUndSchwierigerVariablenName irgendwo in Deinem Code hast, dann willst Du wahrscheinlich nicht jedesmal das ganze Ding eintippen.
Um Schlüsselwortvervollständigung zu verwenden, tippe die ersten paar Zeichen (z.B. ichBi) und drücke <C-N> (d.h. halte Ctrl gedrückt und drücke N) oder <C-P>. Wenn Vim Dir nicht gleich das Wort gibt, das Du willst, versuch es weiter -- Vim wird durch alle Möglichkeiten durchwechseln, die es finden kann.
Wechsle auf schlaue Art in den Einfügemodus
Die meisten neuen Benutzer von Vim gehen in den Einfügemodus indem sie i tippen. Das funktioniert, aber ist oft sehr ineffizient, da vi eine ganze Menge an Befehlen hat um in den Einfügemodus zu wechseln. Hier sind ein paar der gängigeren:
| i | Links vom aktuellen Zeichen Text einfügen. |
|---|---|
| I | Am Anfang der aktuellen Zeile Text einfügen. |
| a | Rechts vom aktuellen Zeichen Text einfügen. |
| A | Am Ende der aktuellen Zeile Text einfügen. |
| o | Erzeuge eine neue Zeile unter der aktuellen Zeile und füge dort Text ein. |
| O | Erzeuge eine neue Zeile über der aktuellen Zeile und füge dort Text ein. |
| c{Bewegung} | Lösche (change) den Text der mit {Bewegung} übersprungen wird und ersetze ihn durch einzugebenden Text. Zum Beispiel c$ würde den Text ab der Cursorposition bis zum Ende der Zeile löschen und in den Eingabemodus wechseln. ct! würde den Text ab der Cursorposition bis zum (aber nicht inklusive) des nächsten Ausrufezeichens löschen und in den Eingabemodus wechseln. Der gelöschte Text wird in die Zwischenablage kopiert und kann anderswo eingefügt werden. |
| d{Bewegung} | Lösche den Text, der mit {Bewegung} übersprungen wird -- das selbe wie c{Bewegung}, aber wechselt nicht in den Eingabemodus. |
Bewege Textblöcke effizient
Benutze visuelle Auswahlen und den passenden Auswahlmodus
Anders als beim original vi, gibt es bei Vim die Möglichkeit Text zu markieren und Arbeiten daran auszuführen. Es gibt drei wichtige visuelle Auswahlmodi (d.h. Textmarkierungsmodi). Und zwar folgende:
| v | Zeichenweise Auswahl. Dies ist der Auswahlmodus, den die meisten Leute gewohnt sind, also übe mit diesem bevor Du die anderen versuchst. |
|---|---|
| V | Zeilenweise Auswahl. Ganze Zeilen werden ausgewählt. Dies ist besser als die zeichenweise Auswahl, wenn Du mehrere Zeilen kopieren oder bewegen willst. |
| <C-V> | Blockweise Auswahl. Extrem mächtig und nur in sehr wenigen anderen Textverarbeitungsprogrammen verfügbar. Du kannst einen rechteckigen Bereich auswählen und jeder Text in diesem Bereich wird markiert. |
Die normalen Cursorbewegungen sind hier anwendbar -- so würde z.B. vwww in den visuellen Auswahlmodus wechseln und die nächsten drei Wörter markieren. Vjj würde in den zeilenweisen visuellen Auswahlmodus wechseln und die aktuelle Zeile und die zwei Zeilen darunter markieren.
Ausschneiden und Kopieren von markiertem Text
Wenn Du eine markierte Auswahl hast, dann willst Du wahrscheinlich etwas damit tun. Einige der nützlicheren Befehle, die man auf markierten Text anwenden kann:
| d | Lösche (delete) den markierten Text und kopiere ihn in die Zwischenablage |
|---|---|
| y | Kopiere den markierten Text in die Zwischenablage |
| c | Schneide den markierten Text aus und lege ihn in die Zwischenablage. Das ist genau wie bei d, mit dem Unterschied, dass man hierbei in den Eingabemodus wechselt. |
Ausschneiden und Kopieren von nicht-visuellen Auswahlen
Wenn Du genau weißt, was Du kopieren oder ausschneiden willst, kannst Du das, ohne in den visuellen Modus zu wechseln. Das spart Zeit.
| d{Bewegung} | Schneide den Text aus, der von {Bewegung} übersprungen wird und kopiere ihn in die Zwischenablage. Zum Beispiel dw schneidet ein Wort aus und dfS schneidet von der Cursorposition bis inklusive dem nächsten großen S in der aktuellen Zeile. |
|---|---|
| y{Bewegung} | Kopiere den Text, der mit {Bewegung} übersprungen wird. |
| c{Bewegung} | Schneide den Text aus, der mit {Bewegung} übersprungen wird und wechsle in den Eingabemodus |
| dd | Schneide die aktuelle Zeile aus. |
| yy | Kopiere die aktuelle Zeile. |
| cc | Schneide die aktuelle Zeile aus und wechsle in den Eingabemodus. |
| D | Schneide den Text vom Cursor bis zum Ende der Zeile aus. |
| Y | Kopiere die ganze Zeile, genau wie mit yy. (Ja, das ist inkonsistent! Du kannst y$ benutzen um das zu erreichen, was Du von Y erwarten würdest.) |
| C | Vom Cursor bis zum Ende der Zeile ausschneiden und in den Eingabemodus wechseln. |
| x | Das Zeichen unter dem Cursor ausschneiden. (Dies ist so ähnlich wie eine Löschtaste im Befehlsmodus.) |
| s | Das Zeichen unter dem Cursor ausschneiden und in den Eingabemodus wechseln. |
Einfügen
Einfügen ist einfach. Setze den Cursor an die Stelle wo der Text eingefügt werden soll und drücke p.
Mehrere Zwischenablagen benutzen
Die meisten Textverarbeitungsprogramme haben eine einzige Zwischenablage. Vim hat viele mehr. Zwischenablagen werden in Vim Register genannt. Du kannst alle aktuell definierten Register auflisten indem Du :reg im Befehlsmodus eingibst. Typischerweise benutzt man die Register mit den kleinen Buchstaben als Namen; die anderen werden für verschieden Vim-interne Zwecke benutzt und sind nur gelegentlich hilfreich.
Um ein bestimmtest Register für einen Kopier- oder Einfügevorgang zu verwenden, tippe "a vor dem entsprechenden Befehl für den Vorgang, wobei a der Name des Registers ist, das Du benutzen willst.
Um beispielsweise die aktuelle Zeile in das Register k zu kopieren, kannst Du "kyy eintippen. (Du kannst aber auch V"ky eintippen. Warum würde das funktionieren?). Die Zeile bliebe in Register k bis Du ausdrücklich etwas anderes in Register k kopierst. Du kannst dann "kp benutzen, um Text aus dem Register k einzufügen.
Wiederholungen vermeiden
Der fantastische . Befehl
Die Eingabe von . (ein Punkt) wiederholt in Vi den letzten Befehl. Wenn beispielsweise Dein letzter Befehl dw (Wort löschen) war, wird vi noch ein Wort löschen.
Zähler verwenden.
Zähler sind eines der mächtigsten und zeitsparensten Leistungsmerkmale, die es in Vim gibt. Jedem Befehl kann eine Zahl vorangestellt werden. Die Zahl legt fest wie oft der Befehl ausgeführt wird. Hier sind ein paar Beispiele:
3j bewegt den Cursor 3 Zeilen nach unten.
10dd löscht 10 Zeilen.
y3f" kopiert Text ab der Cursorposition bis zum dritten Anführungszeichen nach dem Cursor in der aktuellen Zeile. Zähler sind nützlich um auf diese Weise den Bereich einer Bewegung auszuweiten.
Macros aufzeichnen
Gelegentlich stellt man fest, dass man die selbe Dinge immer und immer wieder bei Textbereichen im Dokument macht. Vim gibt einem die Möglichkeit eigens zu diesem Zweck ein Macro aufzuzeichnen, um den Arbeitsablauf durchzuführen.
| qRegister | Starte die Aufzeichnung des Macros ins genannte Register. Beispielsweise qa startet die Aufzeichnung und speichert das Macro im Register a. |
|---|---|
| q | Beendet die Aufzeichnung. |
| @Register | Führe das Macro im genannten Register aus. Zum Beispiel @a führt das Macro in Register a aus. |
Bedenke, dass Macros nur Deine Tastatureingaben aufzeichnen und diese wiederholen; sie können nicht zaubern. Macros aufzuzeichnen ist fast schon eine Kunstform, da es so viele Möglichkeiten gibt eine bestimmte Aufgabenstellung zu bewältigen und Du sorgfältig die Befehle auswählen musst, die Du während der Aufzeichnung verwendest, damit das Macro überall dort funktioniert, wo Du es ausführen willst.
Code schreiben in Vim
Vim ist ein exzellenter Editor für Quellcode, da er viel Funktionen hat, die speziell dafür vorgesehen sind Programmierern zu helfen. Hier sind ein paar wenige der praktischeren:
| ]p | Genau wie p, aber passt automatisch die Einrückungstiefe an den Code an, in den Du einfügst. Probiers aus! |
|---|---|
| % | Wenn Du den Cursor auf eine runde, eckige oder geschweifte Klammer positionierst und % drückst, landet der Cursor auf der entsprechenden Gegenklammer. Großartig um Parse-Probleme zu beheben, die mit stark verschachteltem Code zu tun haben. |
| >> | Rückt den markierten Code ein. (Siehe auch den obigen Abschnitt über effiziente Textauswahl. Wenn kein Text ausgewählt ist, wird die aktuelle Zeile eingerückt. (Funktioniert auch zusammen mit Zählern Anm. d. Übersetzers)) |
| << | Wie >>, aber reduziert die Einrückunstiefe. |
| gd | Gehe zur Definition (oder Deklaration) der Funktion oder Variablen unter dem Cursor. |
| K | Gehe zur man page für den Begriff an der Cursorposition. (Wenn der Cursor beispielsweise auf dem Wort sleep steht, wird die man page für sleep angezeigt.) |