Vorlesung "UNIX"

von Prof. Jürgen Plate

6. Bildschirmeditor vi

Der Editor vi ("vi" steht für "visual") ist ein bildschirmorientierter Editor, d. h. der Text ist in seiner aktuellen Version auf dem Bildschirm zu sehen. Es erfolgt hier nur ein Überblick der Möglichkeiten des vi. Programmaufruf:

vi Dateiname

Ist die Datei vorhanden, wird sie in den Editorpuffer geladen, andernfalls wird sie neu angelegt. 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 oder Überschreiben vorhandener Textpassagen.

    Das Umschalten zwischen den Modi erfolgt mit der ESC-Taste ([ESC]). 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 ed.

    Bleiben wir gleich bei den ex-Befehlen. Nach der Eingabe des : springt der Cursor in die letzte Zeile und erlaubt die Eingabe eines ex-Befehls, der mit der Return-Taste abgeschlossen wird. Es sind nach dem Doppelpunkt alle ed-Befehle möglich.Für den Einstieg genügen:

    :wText auf die Platte schreiben
    :w!Text auf die Platte schreiben, Schreibschutz ignorieren
    :wqText auf die Platte schreiben und vi beenden
    [ESC] Z Zwie :wq
    :xwie :wq
    :w DateiText auf die angegebene (andere) Datei schreiben
    w >> DateiText an die angegebene Datei anhängen
    :qAbbrechen, ohne den Text auf Platte zu schreiben.
    Bei Änderungen im Text erfolgt eine Warnung und kein Abbruch.
    :q! Abbrechen, ohne den Text auf Platte zu schreiben.
    :r DateiText aus der angegebenen Datei nach der momentanen Zeile einfügen.
    :e DateiNeue Datei bearbeiten (der Textpuffer wird überschrieben). Ist die aktuelle Datei noch nicht gespeichert worden, erfolgt eine Warnung.
    :e! DateiNeue Datei bearbeiten (der Textpuffer wird immer überschrieben).
    :nwechselt zur nächsten geladenen Datei (falls beim Aufruf mehr als eine Datei angegeben wurde).

    Umschalten in den Eingabemodus

    a(append) Eingabe rechts vom Cursor
    A Eingabe am Zeilenende
    i(insert) Engabe links vom Cursor
    IEingaben am Zeilenanfang
    oEingabe ab der aktuellen Zeile, d.h. in der folgenden Zeile, Spalte 1.
    OEingabe in der vorhergehenden Zeile, Spalte 1.

    Wenn es die Hardware ermöglicht, ändert sich die Form des Cursors beim Wechsel zwischen Eingabe- und Kommandomodus. Bei vielen vi-Versionen wird der Eingabemodus unten rechts am Bildschirm angezeigt ('append mode', 'input mode');

    Umschalten in den Kommandomodus

    Der Eingabemodus wird durch Drücken der ESC-Taste verlassen und somit der Kommandomodus aktiv.

    Blättern auf dem Bildschirm

    CTRL-FEine Bildschirmseite vorwärts
    CTRL-BEine Bildschirmseite rückwärts
    CTRL-DEine halbe Bildschirmseite vorwärts
    CTRL-LBildschirm neu aufbauen

    Cursorpositionierung (im Kommandomodus)

    Normalerweise ist der vi an die Pfeiltasten der Tastatur richtig angepaßt. Das muß aber nicht immer so sein. Deshalb helfen manchmal nur die folgenden Möglichkeiten (Auswahl):

    hZeichen links (auch Backspace)
    l Zeichen rechts (auch blank)
    k Spalte höher
    jSpalte tiefer
    b Wortanfang
    eWortende
    wAnfang nächstes Wort
    HAnfang erste Zeile des Bildschirms
    LAnfang letzten Zeile des Bildschirms
    0(Null) Zeilenanfang
    $Zeilenende
    RETURNnächste Zeile
    nG(Go) Gehe zu Zeile n. n ist eine Zeilennummer. Fehlt die Zahl, wird zur letzten Zeile der Datei gesprungen.
    %sucht zur aktuellen Klammer die korrespondierende öffnende bzw. schließende Klammer

    Löschen von Text (im Kommandomodus)

    xZeichen unter dem Cursor löschen
    XZeichen vor dem Cursor löschen
    dwab Cursorposition bis Wortende löschen
    dbab Cursorposition bis Wortanfang lö
    [n] ddn ganze Zeilen löschen. Falls n fehlt, wird eine Zeile gelöscht.
    Dab Cursorposition bis Zeilenende löschen

    Text ändern:

    Änderungskommandos wechseln automatisch in den Eingabemodus, der mit der ESC-Taste verlassen werden muß.

    rZeichen ersetzen (kein Abschluß mit ESC)
    ~Wechsel Groß-/Kleinbuschst. (kein Abschluß mit ESC)
    RMehrere Zeichen ersetzen
    sEin Zeichen ersetzen und zusätzliche Zeichen anschließend einfügen
    ccGesamte Zeile ändern
    cwWort ändern
    Cab Cursorposition bis Zeilenende ändern

    Suchen nach Zeichen oder Strings

    fxZeichen "x" in der momentanen Zeile suchen (vorwärts)
    FxZeichen "x" in der momentanen Zeile suchen (rückwärts)
    Die folgenden Suchkommandos müssen mit der Return-Taste abgeschlossen werden
    /strString "str" vorwärts in der Datei suchen
    ?strString "str" rückwärts in der Datei suchen
    //Letzten Suchbefehl wiederholen (vorwärts)
    ??Letzten Suchbefehl wiederholen (rückwärts)

    Sonstige Kommandos

    .Letztes Kommando wiederholen
    JZeilen verbinden (nächste Zeile anhängen)
    uLetzten Befehl rückgängig machen
    UAktuelle Zeile wiederherstellen
    CTRL-gZeilennummer und Dateiinfo zeigen
    CTRL-vNächstes Zeichen transparent eingeben (z. B. Steuerzeichen)
    :! cmdVerläßt vi temporär und führt das Kommando cmd aus (ggf. Rückkehr mit exit).
    :r! cmdFügt die Ausgabe von cmd ab Cursorposition ein.
    !! cmdbenutzt aktuelle Zeile als Eingabe für cmd und ersetzt durch dessen Ausgabe.

    Zum Kopieren dient der y-Befehl (yank), mit dem Textteile in einen Puffer kopiert werden. "y" wird in der Regel mit einem zweiten Steuerbuchstaben kombiniert, der angibt, wieviel Text gepuffert wird (z. B. "yw", "y$"). Eine ganze Zeile wird mit "yy" oder "Y" kopiert. Vor "yy" kann noch die Anzahl der zu kopierenden Zeilen stehen (z. B. 12yy). Das Einfügen des Kopierten Textes geht dann mit p (vor dem Cursor) oder P (nach dem Cursor).

    Zusätzlich bietet der vi weitere Steuerungsfunktionen für den Editor und einen Makromechanismus. Kommandofolgen können damit durch ein einziges Befehlswort abgerufen werden. Weitere Infos auf den vi-Manualpages.

    Weitere Techniken:

    Makros

    Makros sind nichts weiter, als die Zusammenfassung von vi-Kommandos unter einer Taste. Man kann so häufig benutzte Tastenbetätigungen augf eine Taste legen. Bei der Definition von Makros sollten Sie immer davon Ausgehen, daß sich der vi im Kommandomodus befindet. Die Makros lassen sich auch dauerhaft in der Datei .exrc im eigenen Homedirectory speichern. Sie werden dann immer beim Aufruf des vi geladen. In .exrc lassen sich auch andere vi-Voreinstellungen vornehmen (siehe vi-Manualpage, set-Kommando). Die Definition eines Makros ist recht einfach (entweder als Zeile in .exrc oder im ex-Modus, also eingeleitet durch Doppelpunkt:

    map <Makroname> <Kommandofolge>

    MIt map ohne Parameter gibt es eine Liste der Makros und mit unmap kann ein Makro gelöscht werden. Steuerzeichen (RETURN, ESC, BACKSPACE, etc.) können natürlich nicht direkt eingegeben werden, sondern als CTRL-V <Stuerzeichen>. In den Beispielen unten werden die Steuerzeichen beispielsweise als <CTRL-X> dargestellt. Zum Beispiel kann man den Text "Mit freundlichen Grüßen" auf den Tastencode "fg" legen, indem man mit "i" in den Eingabemodus wechselt, den Text angibt und dann wieder in den Kommandomodus geht:

    map fg iMit freundlichen Grüßen<ESC>

    Um das ESC-Zeichen einzugeben, tippt man <CTR-V><ESC>. Man könnte auf diese Weise auch die gewohnten PC-Tasten (in der entsprechenden Terminal-Emulation) auf die vi-Kommandos legen.

    " Taste einf
    map <ESC>[2~ i
    " Taste del
    map <ESC>[3~ x
    " Taste pos1
    map <ESC>[1~ ^
    " Taste end
    map <ESC>[4~ $
    " Taste PgUp
    map <ESC>[5~ <CTRL-B>
    " Taste PgDown
    map <ESC>[6~ <CTRL-F>

    Wenn der vi zickt

    Manchmal kommt es vor, dass die Cursortasten beim vi nicht wie gewünscht funktionieren, insbesondere bei ssh-Verbindungen oder wenn der Terminal-Typ nicht ganz stimmt. Statt einer Cursorbewegung erscheinen Buchstaben auf dem Bildschirm. Das liegt daran, dass bei vielen Terminal-Emulationen die Steuertasen einen Code aus mehreren ASCII-Zeichen senden. Zu sehen sind dann nur die darstellbaren Zeichen. Abhilfe schaffen meist die drei folgenden Zeichen in der Datei '.nexrc' (Original-vi) oder '.vimrc' (vim unter Linux) im Heimatverzeichnis:
    :set timeout ttimeoutlen=100 timeoutlen=5000
    :set term=builtin_ansi
    :set nocompatible
    

    Literaturhinweise

    L. Lamb:
    Learning the vi Editor
    O'Reilly & Ass. (1990)

    S. von Bomhard:
    Hartes Brot - vi-Tips für Neugierige
    iX, 4/92, S. 115-119, Heise Verlag

    Manualpage zum vi (man vi)

    Im Anhang finden Sie noch eine vi-Kurzreferenz.

    Zum Inhaltsverzeichnis Zum nächsten Abschnitt
    Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
    Letzte Aktualisierung: 13. Jan 2006