Diese Seite enthält eine Aufstellung nützlicher Befehle für den vi/vim.
Der Befehl vimtutor führt einen sanft in die Bedienung des Vim ein.
= Modi des vim =
Meistbenutzte Modi des vim:
Normal-/Befehlsmodus
- Anfangszustand des vim: Von ihm aus erreicht man alle anderen Modi.
- Durch 2 x ESC von überall erreichbar.
Einfügemodus
- Vom Normalmodus aus durch Eingabe des Zeichens i (insert).
- Zum Normalmodus hin durch Drücken von ESC oder CTRL+C
- Fast jedes eingegebene Zeichen wird in die Datei geschrieben (bis auf bspw. ESC)
Kommandozeilenmodus
- Vom Normalmodus aus durch Eingabe von : (Doppelpunkt)
- Zum Normalmodus hin durch Drücken von ESC.
Visueller Modus
Vom Normalmodus aus durch Eingabe von
- v (normales Markieren),
- V (zeilenweise markieren) oder
- CTRL+V (blockweise).
= Basisbefehle =
Durch wiederholtes Drücken von ESC erreicht man immer wieder den Anfangs-/Befehlsmodus.
Bewegungsbefehle
Bewegen kann man den Cursor über die Pfeiltasten oder über hjkl, was etwas schneller, aber auch gewöhnungsbedürftig ist, da man in der Zehnfingerstellung verbleiben kann.
Den Zeilenanfang erreicht man mit ^ oder der Null 0, das Zeilenende mit $.
Die aktuelle Zeilenummer erhält man mit CTRL+G.
Den Dokumentenanfang erreicht man mit gg, das Dokumentenende mit G.
An eine beliebige Zeile, sagen wir 1023, kann man sich durch den folgende Befehl bewegen:
1023G
Das nächste Wort erreicht man mittels w (word), das vorige Wort mit b(back), zum Wortende” des aktuellen Wortes kommt man mittels e
gg
k
^,0 b w,e $
j
G
Jedem dieser Bewegungsbefehle kann man einen Faktor voranstellen, der angibt, wie häufig die Operation ausgeführt werden soll: Bei der Eingabe von 3w bewegt man sich 3 Wörter vorwärts.
Einfügen
Ausgangspunkt ist der Normalmodus. Die folgenden Befehle wechseln in den Einfügemodus:
- Befehl i (insert): Einfügen vor dem markierten Zeichen
- Befehl a (append): Einfügen nach dem markierten Zeichen
- Befehl O: Einfügen einer leeren Zeile vor der aktuellen Zeile
- Befehl o: Einfügen einer leeren Zeile nach der aktuellen Zeile
Kopieren
Ausgangspunkt ist der Normalmodus.
- Befehl yy (yank): Kopieren der aktuellen Zeile (danach mit p einfügen)
Löschen
Das Löschkommando setzt sich aus dem Löschoperator d und einer Bewegungsrichtung zusammen; man kann alle oben erwähnten Bewegungsbefehle (^,$,e,w,2w,b,3b,…) nutzen.
- Befehl dw (delete word):
- * innerhalb eines Wortes: aktuelles Wort löschen
- * innerhalb von Leerzeichen: alle Leerzeichen bis zum nächsten Wort löschen
- Befehl d$ (delete bis $) löscht alles bis zum Ende der Zeile (inkl. aktuelles Zeichen)
Etwas anders verhält es sich mit dem Löschoperator für ganze Zeilen: Um eine Zeile zu löschen, tippt man
dd
Genau wie zuvor bei den Bewegungsrichtungen gibt es auch hier die Möglichkeit, eine Wiederholungszahl anzugeben.
Um bspw. 3 Zeilen (die aktuelle und die beiden folgenden) zu löschen, wählt man:
3dd
Ersetzen
Aus dem Normalmodus heraus kann man mit dem Befehl r (Replace) ganz bequem einzelne Zeichen ersetzen.
Möchte man das aktuell markierte Zeichen durch ein q ersetzen, dann tippt man:
rq
Man kann auch größere Bereiche mit dem Befehl c (Change) ersetzen, dabei gelten die oben genannten Bewegungsrichtungen (0,$,e,b,…).
Nach dem Befehl ist man im Einfügemodus und gibt den Ersatztext ein.
Undo, Redo und Repeat
- Mittels u (Undo) macht man den letzten Befehl rückgängig.
- Mittels U (Undo) wird die aktuelle Zeile wiederhergestellt.
- Der Befehl CTRL+R (Redo) wird der zuletzt mittels u zurückgenommenen Befehl wieder ausgeführt.
Dies ist nicht zu verwechseln mit einer Wiederholung des zuletzt durchgeführten Befehls: . (Punkt, Repeat).
Zwischenablage
Der Löschbefehl wirkt wie ein Ausschneiden in einem normalen Texteditor:
Die gelöschten Zeichen werden zwischengespeichert und man kann sie einfügen mittels p (Paste oder Put), dabei wird der Inhalt der Zwischenablage stets nach der aktuellen Cursorposition eingefügt, was bei ganzen Zeilen (dd,2dd,…) dazu führt, dass die neue Zeile unter der aktuellen eingefügt wird.
= Ansicht =
Zeilennummern anzeigen/verbergen
Im Befehlsmodus kann man mittels
:set number
Zeilennummern anzeigen lassen und diese mit
:set nonumber
wieder verbergen.
Die aktuelle Zeilennummer erhält man am unteren Bildschirmrand mit Ctrl+G.
Ansicht der aktuellen Datei aktualisieren (Refresh)
Aktuelle Datei neu laden:
:e
Mehrere Dateien öffnen (Tabs)
Neue Datei öffnen:
:tabe
Zum vorherigen Tab springen:
:tabp
Zum nächsten Tab springen:
:tabn
Datei des aktuellen Tabs schließen:
:q
Alle Tabs schließen:
:qall
= Anwendungsfälle =
Man Page eines Befehls öffnen
Die zu einem Befehl gehörige Man Page kann man öffnen, indem man den Cursor im Namen des Befehls platziert und den Befehl K startet.
Verlassen kann man die Man Page wie gewohnt mit q.
Eine referenzierte Datei öffnen
Wenn man im Vim entwickelt, möchte man manchmal eine Datei öffnen, die bspw. bei C/C++ mit einem #include eingebunden wird.
Im Vim ist dies sehr einfach:
Man bewegt sich mit dem Cursor auf den Namen der referenzierten Datei und startet den Befehl (go file):
:gf
Leere Zeilen entfernen
:g/^$/d
Der Befehl :g/[regex]/[cmd] nimmt einen regulären Ausdruck [regex] (hier ^$– ^ ist der Zeilenanfang, $ das Zeilenende) und wendet das zuletzt stehende Kommando [cmd] (hier d) auf alle zutreffenden Zeilen an.
Suchen ohne Ersetzen
Im Befehlsmodus: Suche (case insensitive) nächstes Vorkommen von type:
/type
Nächsten Treffer anzeigen: n drücken; vorherigen Treffer anzeigen N drücken.
Case Sensitive Search
Die Suche im vim ist standardmäßig case insensitive.
Um die Suche case sensitive zu machen, muss die Sequenz \C in die Suchanfrage aufgenommen werden:
/Type\C
…findet also nur den Term Type, nicht aber type, TYpe etc.
Suchen und Ersetzen
Alle Vorkommnisse (g) von foo innerhalb einer Zeile durch bar ersetzen:
:s/foo/bar/g
Alle Vorkommnisse (g) von foo innerhalb einer Datei durch bar ersetzen:
:%s/foo/bar/g
Weitere/alternative Optionen zu g:
- c (confirm) bestätige jede Ersetzung
- i (ignore case) Groß-/Kleinschreibung ignorieren (d.h. im Beispiel würden auch Foo, fOo, etc. durch bar ersetzt)
- kein g nur in der aktuellen Zeile ersetzen
Blockweise einkommentieren
Quelle: [http://notfaq.wordpress.com/2006/07/28/vim-comment-blocks-of-code/]
- Erste Spalte des zu kommentierenden Textblocks markieren (Ctrl+v, kann mittels Ctrl+v auch wieder verlassen werden)
- In den Einfügemodus wechseln mit I (großes i).
- Zeilenkommentarzeichen eingeben (bspw. # bei der BASH oder // bei C)
- ESC, um den Einfügemodus zu verlassen
- (Manchmal erscheinen die Zeichen erst, wenn man eine weitere Taste drückt)
Blockweise auskommentieren
Haben alle Zeilen dengleichen Anfang (bspw. ###), dann kann man wie in vorigem Abschnitt vorgehen:
- Die zu löschenden Kommentarzeichen als Textblock markieren (Ctrl+v, kann mittels Ctrl+v auch wieder verlassen werden)
- Löschen mittels x.
- Der Editor kehrt automatisch in den Anfangsmodus zurück.