Zum Inhalt springen

vim

vim (vi improved) stammt vom Editor vi ab, der aus den 1970er-Jahren kommt. Damals gab es keine Maus, darum läuft alles über die Tastatur. Das wirkt heute ungewohnt, hat aber einen handfesten Vorteil: vi oder vim ist auf jedem Linux- und Unix-System vorhanden, auch auf einem minimal installierten Server, in einem Container oder im Rettungsmodus. Wenn du per SSH auf einem fremden System eine Konfigurationsdatei anpassen musst, ist vim oft der einzige Editor, den du antriffst.

Du musst kein vim-Profi werden. Aber öffnen, ein paar Zeilen ändern, speichern und wieder rauskommen, das gehört zum Handwerk. Nach einer kurzen Einarbeitung ist vim zudem sehr effizient, weil die Hände nie die Tastatur verlassen.

Ubuntu liefert je nach Installation nur vim-tiny, eine abgespeckte Version ohne Syntax-Highlighting und ohne vimtutor. Installiere die vollständige Version:

Terminal-Fenster
sudo apt update
sudo apt install vim
vim --version | head -n 1

Das Paket vim zieht vim-runtime mit den Hilfedateien und vimtutor automatisch nach. Ein früher übliches Paket vim-scripts gibt es nicht mehr. Der Befehl vi zeigt auf Ubuntu nach der Installation ebenfalls auf vim.

sudo apt install vim

Der Kern des Konzepts: vim hat mehrere Modi, und dieselbe Taste tut je nach Modus etwas anderes.

Modus Zweck Du erkennst ihn an
Normalmodus Befehle: bewegen, löschen, kopieren, suchen. Hier startet vim. Keine Anzeige unten links
Einfügemodus Text tippen. Fast jede Taste landet als Zeichen in der Datei. -- EINFÜGEN -- oder -- INSERT -- unten links
Kommandozeilenmodus Längere Befehle: speichern, beenden, suchen und ersetzen, zu Zeile springen. Ein : oder / in der untersten Zeile
stateDiagram-v2
    state "Normalmodus" as N
    state "Einfügemodus" as I
    state "Kommandozeilenmodus" as C
    [*] --> N: vim datei.txt
    N --> I: i, a, o, A, O
    I --> N: Esc
    N --> C: Doppelpunkt oder Schrägstrich
    C --> N: Enter oder Esc
    C --> [*]: wq oder q!

Die wichtigste Taste ist Esc: Sie bringt dich aus jedem Modus zurück in den Normalmodus. Wenn du nicht weisst, wo du bist, drücke zweimal Esc. Ein Piepsen bedeutet nur «du warst schon im Normalmodus».

  1. Datei anlegen und vim starten. Du bist im Normalmodus.
    Terminal-Fenster
    mkdir -p ~/vim-test && cd ~/vim-test
    vim notizen.txt
  2. i drücken. Unten erscheint -- INSERT --. Tippe zwei bis drei Zeilen Text, Enter für neue Zeilen.
  3. Esc drücken. Die Anzeige unten verschwindet, du bist zurück im Normalmodus.
  4. :wq tippen (erscheint unten) und Enter. Speichern und beenden.
  5. Kontrolle im Terminal:
    Terminal-Fenster
    cat notizen.txt

Das ist bereits der Minimal-Zyklus, den du auf jedem Server brauchst: vim datei, i, tippen, Esc, :wq.

Alle folgenden Befehle gelten im Normalmodus. Gross- und Kleinschreibung ist relevant.

Taste Wirkung
Pfeiltasten oder h j k l links, runter, rauf, rechts
w / b zum Anfang des nächsten / vorherigen Worts
e zum Ende des Worts
0 / $ Zeilenanfang / Zeilenende
gg / G Anfang / Ende der Datei
:15 zu Zeile 15 springen
Ctrl+F / Ctrl+B eine Seite vor / zurück
Taste Wirkung
i / a einfügen vor / nach dem Cursor
I / A einfügen am Zeilenanfang / Zeilenende
o / O neue Zeile unterhalb / oberhalb öffnen und einfügen
r ein Zeichen unter dem Cursor ersetzen (bleibt im Normalmodus)
R überschreiben ab Cursor, bis Esc
cw Wort ab Cursor löschen und in den Einfügemodus wechseln (change word)
Taste Wirkung
x Zeichen unter dem Cursor löschen
dw Wort löschen
dd Zeile löschen (landet in der Zwischenablage)
dG von hier bis Dateiende löschen
D vom Cursor bis Zeilenende löschen
yy Zeile kopieren (yank)
p / P Zwischenablage unterhalb / oberhalb einfügen (put)
J nächste Zeile an diese anhängen

Gelöschte Zeilen liegen in der Zwischenablage: dd und danach p verschiebt eine Zeile.

Taste Wirkung
u Undo, beliebig oft
Ctrl+R Redo
. letzten Änderungsbefehl wiederholen
/wort vorwärts suchen, n nächster Treffer, N vorheriger
?wort rückwärts suchen
:%s/alt/neu/g in der ganzen Datei alt durch neu ersetzen
Befehl Wirkung
:w speichern (write)
:q beenden, verweigert bei ungespeicherten Änderungen
:wq oder :x speichern und beenden
:q! beenden und Änderungen verwerfen
:w! speichern erzwingen, etwa bei einer schreibgeschützten Datei, die dir gehört

Fast jeder Befehl nimmt eine Zahl davor: 3dd löscht drei Zeilen, 5j geht fünf Zeilen runter, 2w springt zwei Wörter, 3u macht drei Änderungen rückgängig, 4yy kopiert vier Zeilen.

Terminal-Fenster
cd ~/vim-test
seq 1 20 | sed 's/^/Zeile /' > zahlen.txt
vim zahlen.txt

Probiere der Reihe nach, alles im Normalmodus: G (ans Ende), gg (an den Anfang), 5j (fünf runter), dd (Zeile weg), u (zurück), 3dd (drei weg), p (wieder einfügen, aber eine Zeile tiefer), /Zeile 1 und dann n ein paar Mal, :12 (zu Zeile 12), A und ende tippen, Esc, :%s/Zeile/Line/g, :q!. Was erwartest du nach :q! in der Datei zu sehen? Prüfe mit cat zahlen.txt.

Vim bringt ein eigenes Lernprogramm mit: vimtutor öffnet eine Kopie einer Übungsdatei in vim. Du liest die Anleitung und führst die Befehle direkt im Text aus. Die Datei ist eine Kopie, du kannst nichts kaputt machen.

Terminal-Fenster
vimtutor de

Falls der Text trotzdem auf Englisch erscheint: :q!, Enter und nochmals versuchen. Die englische Version ist inhaltlich identisch. Rechne mit 30 bis 45 Minuten für die ersten drei Lektionen.

Arbeite die folgenden Lektionen selbständig durch:

  • Lektion 1: Cursor bewegen, vim beenden, Löschen, Einfügen, Anfügen, eine Datei editieren
  • Lektion 2: Löschkommandos, Operatoren und Bewegungen, Zähler, Zeilen, Undo
  • Lektion 3: Put, Replace, Change

Wenn die ersten drei Lektionen sitzen (nicht vorher), lohnen sich die restlichen:

  • Lektion 4: Cursorposition und Dateistatus, Suchen, passende Klammern, Substitute
  • Lektion 5: externe Kommandos ausführen, Dateien schreiben, Text auswählen, Dateien einlesen
  • Lektion 6: Open, Append, Replace-Modus, Kopieren und Einfügen, Optionen setzen
  • Lektion 7: Hilfe aufrufen, Start-Skript (.vimrc), Vervollständigen

Wer bei Lektion 4 merkt, dass die Grundlagen fehlen, geht lieber nochmals durch 1 bis 3.

Die Datei ~/.vimrc wird beim Start gelesen. Zwei Zeilen reichen für den Anfang:

~/.vimrc
set number
syntax on

set number zeigt Zeilennummern (hilfreich mit :15 und bei Fehlermeldungen wie «Zeile 23»), syntax on färbt Shell-Skripte und Konfigurationsdateien ein. Gleich mit vim anlegen:

Terminal-Fenster
vim ~/.vimrc

Beim nächsten Start von vim ist die Einstellung aktiv. Innerhalb von vim lässt sich dasselbe temporär mit :set number oder :set nonumber schalten.

Lösung anzeigen

Ein möglicher Weg, alles im Normalmodus, ausser wo Esc steht:

  1. /LOESCHEN Enter, dd, n, dd
  2. /nano Enter, cw, vim tippen, Esc. Alternativ :%s/nano/vim/.
  3. gg, 2j (auf 1 Netzwerkkabel), yy, /5 Maus Enter, p, dann r6 auf der neuen Zeile.
  4. G, o, Name tippen, Esc
  5. :wq Enter

Erwartetes Ergebnis:

labs/linux/05-editor-hilfe/vim-uebung.txt
Einkaufsliste Server-Setup
==========================
1 Netzwerkkabel
2 USB-Stick
3 Monitor
4 Tastatur
5 Maus
6 Netzwerkkabel
Standardeditor: vim
Ende der Liste
Vorname Nachname
# Befehle: dd, cw, yy, p, r

Selbstcheck · 6 Fragen

1. Du bist im Einfügemodus und willst speichern und beenden. Welche Tasten?
2. Welche Taste bringt dich aus jedem Modus zurück in den Normalmodus?
3. Was macht 3dd?
4. Du hast dich vertippt und willst vim verlassen, ohne irgendetwas zu speichern.
5. Welche Befehle wechseln in den Einfügemodus? (mehrere Antworten möglich)
6. Welcher Befehl macht die letzte Änderung rückgängig?