Vim/Anwendung
Einführung
Der Editor vi (visual) ist ein bildschirmorientierter Editor, das heißt der Text ist in seiner aktuellen Version auf dem Bildschirm zu sehen
Vim verfügt über drei verschiedene Arbeitsmodi
- Diese werden im folgenden kurz beschrieben
 - Die wichtigsten Tastenkürzel zur Arbeit mit dem Vim werden im Artikel Vim/Shortcuts erläutert
 
Nach dem Aufruf des vi befindet sich der Benutzer im Kommandomodus
- Die Arbeit spielt sich wie beim ed immer in zwei Ebenen ab
 
Kommandomodus
- Freies Positionieren innerhalb des Textes
 - Umsetzen von Textblöcken
 - Schreiben und Lesen von Dateien
 - Löschen von Textblöcken und Aufruf von UNIX-Kommandos
 
Eingabemodus
- Einfügen von Text
 - Überschreiben vorhandener Textpassagen
 
- Das Umschalten zwischen den Modi erfolgt mit der [ESC]-Taste
 - Die Handhabung des Kommandomodus des vi macht die Bedienung für den Anfänger etwas ungewohnt
 - Die Cursorpositionierung erfolgt mit verschiedenen Tasten, für die Eingabe von Dateibefehlen oder anderen Funktionen (z. B. Suchen/ersetzen) ist die Eingabe eines Doppelpunktes nötig
 - Man befindet sich dann in ex-Modus, der ähnliche Eigenschaften hat, wie der Editor ed
 
Starten
vi [Dateiname]
- Ist die Datei vorhanden, wird sie in den Editorpuffer geladen, andernfalls wird sie neu angelegt
 - Wird der vi ohne die Angabe eines Dateinamens gestartet, ist der Bildschirm auf der linken Seite mit Tilden (~) gefüllt
 - Jede leere Zeile hinter dem Ende der Datei wird auf diese Art dargestellt
 - Am unteren Ende des Bildschirms wird der Dateiname anzeigt, falls eine existierende Datei angegeben wurde
- Die Größe der Datei wird ebenfalls angezeigt
 - Wenn diese Informationen nicht angezeigt werden, könnte es sein, dass der Terminaltyp falsch gesetzt ist
 - Dann sollte der vi mit :q! und [ENTER] verlassen und der Terminaltyp korrekt eingestellt werden
 
 
Falls die angegebene Datei nicht existiert, wird auf folgende Art angezeigt, dass es sich um eine neue Datei handelt
"newfile" [New file]
Nach dem Start ohne Dateinamen, ist die unterste Bildschirmzeile leer
Hilfen
| man vi | Manualpage von vi aufrufen | 
| :h <Stichwort> | Hilfe aufrufen (mit :q verlassen) | 
| vimtutor | Lernprogramm | 
Befehlsmodus
- Nach dem Aufruf befindet sich Vim im Befehlsmodus
 
Vergleichbar mit Klicken durch die Menüs eines grafischen Programms
| Tastenkürzel | Aktion | 
|---|---|
| j | Schritt abwärts | 
| k | Schritt aufwärts | 
| h | Schritt nach links | 
| l | Schritt nach rechts | 
| dd | löscht eine komplette Zeile an der Cursorposition | 
| u | macht letzte Änderung rückgängig | 
| STRG + R | macht u rückgängig | 
| ZZ | speichert die Datei und beendet Vim | 
Einfügemodus
Befindet sich der Vim im Einfügemodus, so kann der Text nach Belieben editiert werden
| Tastenkürzel | Aktion | 
|---|---|
| i | Editiermodus an der Cursorposition starten | 
| a | Editiermodus eine Stelle hinter der Cursorposition starten | 
| o | Zeile unterhalb der Cursorposition einfügen und Editiermodus starten | 
| ESC | Editiermodus verlassen | 
Kommandozeilenmodus
Neben Befehlen, die zum Bewegen durch die Datei oder deren Modifikation dienen, kann man im Kommandozeilenmodus auch Parameter des Programms selber ändern, Dateien laden und/oder (Shell-) Befehle ausführen
- Das Verhalten ist mit einer Mini-Kommandozeile vergleichbar
 
| Tastenkürzel | Aktion | 
|---|---|
| :w | Datei speichern | 
| :w name | Datei unter name speichern | 
| :q! | Vim ohne Speichern beenden | 
| /such_ausdruck | Datei nach such_ausdruck durchsuchen | 
| :e datei_name | Datei datei_name öffnen | 
| :e # | zur zuvor bearbeiteten Datei zurückkehren | 
Cursorpositionierung
Normalerweise ist der vi an die Pfeiltasten der Tastatur richtig angepasst
- Daneben gibt es noch folgende Möglichkeiten (Auswahl)
 
| h | Zeichen links (auch Backspace) | 
| l | Zeichen rechts (auch blank) | 
| k | Zeile höher | 
| j | Zeile tiefer | 
| b | Wortanfang | 
| e | Wortende | 
| w | Anfang nächstes Wort | 
| H | Anfang erste Zeile des Bildschirms | 
| L | Anfang letzten Zeile des Bildschirms | 
| 0 (Null) | Zeilenanfang | 
| $ | Zeilenende | 
| RETURN | nächste Zeile | 
| nG | (Go) Gehe zu Zeile n. n ist eine Zeilennummer
  | 
| % | sucht zur aktuellen Klammer die korrespondierende öffnende oder schließende Klammer | 
| ( | Cursor zum Anfang des Satzes bewegen | 
| ) | Cursor zum Anfang des nächsten Satzes bewegen | 
| { | Cursor zum Anfang des Absatzes bewegen | 
| } | Cursor zum Anfang des nächsten Absatzes bewegen | 
Befehls-Modus
Die Befehle des Befehls-Modus haben folgendes Format
[Anzahl] Befehl [Ort]
- Die meisten Befehle sind ein Zeichen lang
 - Mit Anzahl wird ein Wiederholungsfaktor dür den folgenden Befehl angegeben
 - So löscht zum Beispiel der Befehl x das Zeichen unter der Schreibmarke
 - Wird 10x eingegeben, werden 10 Zeichen gelöscht
 
Einige Befehle nutzen einen optionalen Ort-Parameter, der angibt, wieviele Zeilen oder wieviel Text des Dokuments vom Befehl bearbeitet werden soll
- Der Ort-Parameter kann auch jeder Befehl sein, der die Schreibmarke bewegt
 
Allgemeine Befehle
| :q | vi beenden (wenn keine Änderungen) | 
| :q! | vi beenden und Änderungen verwerfen | 
Dateibefehle
| :r Datei | Text aus der angegebenen Datei nach der momentanen Zeile einfügen | 
| :w | Datei speichern | 
| :w! | Datei speichern und Schreibschutz ignorieren | 
| :w Datei | Speichern unter ... (angegebene Datei wird überschrieben) | 
| :w >> Datei | Text an die angegebene Datei anhängen | 
| :wq oder :x oder ZZ | Text speichern und vi beenden | 
Mehrere Dateien bearbeiten
Um mehr als eine Datei zu bearbeiten, können beim Aufruf mehrere Dateinamen übergeben oder nachträglich weitere Dateien geöffnet werden
| :e Datei | Neue Datei bearbeiten | 
| :n | Wechselt zur nächsten geladenen Datei | 
Blättern auf dem Bildschirm
Normalerweise ist der vi an die Pfeiltasten der Tastatur richtig angepasst
- Daneben gibt es noch folgende Möglichkeiten (Auswahl)
 
| STRG-F | Eine Bildschirmseite vorwärts | 
| STRG-B | Eine Bildschirmseite rückwärts | 
| STRG-D | Eine halbe Bildschirmseite vorwärts | 
| STRG-U | Eine halbe Bildschirmseite rückwärts | 
| STRG-L | Bildschirm neu aufbauen (wenn zum Beispiel eine Nachricht kam) | 
Texteingabe
| i | (insert) Eingabe links vom Cursor | 
| I | Eingaben am Zeilenanfang | 
| a | (append) Eingabe rechts vom Cursor | 
| A | (appand) Eingabe am Zeilenende | 
| o | Neue Zeile unter der aktuellen Zeile | 
| O | Eingabe in der vorhergehenden Zeile, Spalte 1 | 
Der Eingabemodus wird durch Drücken der [ESC]-Taste verlassen
Text ändern
| ~ | Wechsel Groß-/Kleinbuchstaben (kein Abschluss mit [ESC]) | 
| r | Zeichen ersetzen (kein Abschluss mit [ESC]) | 
| R | Mehrere Zeichen ersetzen | 
| s | Ein Zeichen ersetzen und zusätzliche Zeichen anschließend einfügen | 
| cc | Gesamte Zeile ändern | 
| cw | Wort ändern | 
| C | ab Cursorposition bis Zeilenende ändern | 
| J | Zeilen verbinden (nächste Zeile anhängen) | 
Text ausschneiden
| x | Zeichen unter dem Cursor löschen | 
| X | Zeichen vor dem Cursor löschen | 
| dw | ab Cursorposition bis Wortende löschen | 
| db | ab Cursorposition bis Wortanfang löschen | 
| ndd | n ganze Zeile löschen | 
| D | Ab Cursor bis Zeilenende löschen | 
Gelöschte Zeichen werden im anonymen Puffer abgelegt
Kopieren und Einfügen
- Yank wird in der Regel mit einem zweiten Steuerbuchstaben kombiniert, der angibt, wie viel Text gepuffert wird. (z. B. "yw", "y$")
 - Vor "yy" kann noch die Anzahl der zu kopierenden Zeilen stehen (z. B. 12yy)
 
| yy oder Y | (Yank) ganze Zeile in anonymen Puffer kopieren | 
| yw | Bis zum nächsten Wort kopieren | 
| Y$ | Bis Zeilenende kopieren | 
| p | Hinter dem Cursor einfügen | 
| P | Vor dem Cursor einfügen | 
Suchen und Ersetzen
Außer 'fx' und 'Fx' müssen die Suchkommandos mit der Return-Taste abgeschlossen werden
| fx | Zeichen 'x' in der momentanen Zeile suchen (vorwärts) | 
| Fx | Zeichen 'x' in der momentanen Zeile suchen (rückwärts) | 
| /str | String 'str' vorwärts in der Datei suchen | 
| ?str | String 'str' rückwärts in der Datei suchen | 
| // | Letzten Suchbefehl wiederholen (vorwärts) | 
| ?? | Letzten Suchbefehl wiederholen (rückwärts) | 
| :%s/X/Y/g | Ersetzt alle 'X' durch 'Y' | 
Sonstige Kommandos
| u | Letzten Befehl rückgängig machen | 
| U | Aktuelle Zeile wiederherstellen | 
| Letztes Kommando wiederholen | |
| :!cmd | Verlässt vi temporär und führt das Kommando cmd aus (ggf. Rückkehr mit exit) | 
| :r!cmd | Fügt die Ausgabe von cmd ab Cursorposition ein | 
| !!cmd | Benutzt aktuelle Zeile als Eingabe für cmd und ersetzt durch dessen Ausgabe | 
| Strg + g | Zeilennummer und Dateiinfo zeigen | 
Markierungen
| v | Visuelles Markieren | 
| mA | Marke A setzen | 
| 'A | Zur Marke A springen | 
| d'A | Bis Marke A löschen | 
| y'A | Kopieren bis Marke A | 
Einrücken und klammern
| << | rückt die aktuelle Zeile um eine Einrückungsbreite nach links | 
| >> | rückt die aktuelle Zeile um eine Einrückungsbreite nach rechts | 
| % | Bewegt die Einfügemarke zwischen korrespondierenden Klammern | 
Tipps und Tricks
Zeile verschieben
- Zeile mit dd löschen
 - Zur neuen Position wechseln
 - mit p (hinter dem Cursor)
 - P (vor dem Cursor) einfügen
 
Zeile kopieren
- Zeile mit yy in den Puffer kopieren
 - Zur neuen Position wechseln
 - Zeile mit p (vor dem Cursor)
 - oder P (nach dem Cursor) einfügen
 
Ein paar einfache Tricks
- zwei aufeinander folgende Zeichen vertauschen: xp
 - zwei aufeinander folgende Zeilen vertauschen: ddp
 - eine Zeile duplizieren: yyp
 
Mehrere Zeilen verschieben oder kopieren
Mehrere Zeilen werden durch Voranstellen der Zeilenzahl vor dd oder yy in den Puffer gebracht. Alles Weitere wie oben
Weitere Puffer
- Neben dem anonymen Puffer können 26 weitere Pufferbereiche verwendet werden, die durch einen Buchstaben ("a" - "z") bezeichnet werden
 - Dazu wird ein Doppelapostroph und der Puffername vor den Befehl gestellt, zum Beispiel
 
| "ayy | kopiere Zeile in Puffer a | 
| "b6yy | kopiere die nächsten 6 Zeilen in Puffer b | 
| "ap | Inhalt Puffer a nach dem Cursor einfügen | 
Blöcke von einer Datei in die andere übertragen
- Mit dem Kommando :e <dateiname> kann eine neue Datei bearbeitet werden, ohne den vi zu verlassen
 - vi mit der ersten Datei aufrufen, z. B. : vi foo.txt
 - Textblock mit den Yank-Kommando in einen Puffer schreiben: "f10yy (10 Zeilen in Puffer f)
 - neue Datei holen, z. B. : :e bar.txt
 - an die gewünschte Stelle gehen und Puffer einfügen: "fp