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.

I often wondered why the default syntax highlighting in vim is almost illegible (e.g., dark blue on black background).

The reason is that a syntax highlighting in vim defines two sets of colors, one for light background and one for dark background.

To find out your current color scheme, type:

:set background

To (temporarily) switch to the color scheme for dark background use:

:set background=dark

Vice versa, for light background, use:

:set background=light

To make these changes permanent, add the command without colon (set background=[dark|light]) to ~/.vimrc.

When we encounter strange, unexplainable problems with text files, hidden characters may be reason. This article describes several possibilities to tackle line-ending and whitespace problems.

Correcting mixed line endings

If a file has mixed line endings, the standard tool flip may help you:

echo -e "unix\nmicro\r\n" > test.txt
file test.txt
#result: test.txt: ASCII text, with CRLF, LF line terminators

A check with file reveals that the file test.txt has mixed line endings. Flip unifies the line endings to Unix (-u) or Windows (-m) standard:

flip -u test.txt
file test.txt # result: test.txt: ASCII text

flip -m test.txt
file test.txt # result: test.txt: ASCII text, with CRLF line terminators

Examining files

vim can show whitespace characters, if you enable the option list. In command mode, execute the following to show whitespaces like tabs or line endings. Unfortunately, the editor does not differentiate between different types of line endings.

:set list

Use :set nolist to return to normal view. With :set ff the program identifies the line ending standard.

If you need to get a detailed picture of the whitespace characters in your document, the octal file viewer od may be helpful, it displays the file as octal values and (interpreted) ASCII characters:

echo -e "item1\titem2\titem3\r\nline2 (unix)\n" > test.txt
od -c test.txt

The results looks as follows:

000000  69  74  65  6d  31  09  69  74  65  6d  32  09  69  74  65  6d
         i   t   e   m   1  \t   i   t   e   m   2  \t   i   t   e   m
000010  33  0d  0a  6c  69  6e  65  32  20  28  75  6e  69  78  29  0a
         3  \r  \n   l   i   n   e   2       (   u   n   i   x   )  \n
000020  0a
        \n
000021

Using cat -v text.txt, you can see bogus (non-Unix) line endings  being marked with a special symbol: ^M

item1   item2   item3^M
line2 (unix)

Proved to be quite useful when editing system configuration files (Apache2, etc.). Thanks!

Commenting in blocks of code

Similarly, you may go the reverse direction and comment in blocks of code as follows:

  1. Go to the first line of the block of comments signs you would like to delete: <line>gg
  2. Enable block selection mode: Ctrl+V
  3. Important: Only mark the comment tokens you want to delete, nothing else!
  4. Navigate to the end of the block either with
    • <line>gg or
    • arrow up/down;  j/k
  5. Press d for deletion

(If necessary undo your changes with u)