Diese Seite berücksichtigt einige Eigenschaften, die erst ab Vim 6.x zur Verfügung stehen. Sie ist für Vim-Kenner zum schnellen Nachschlagen von Vim-Kommandos etc. gedacht. Daher wird eine sehr knappe Darstellung gewählt, z.T. nur in Form eines konkreten Beispiels.
Vim hat eine umfangreiche Online-Hilfe:
:help :help ruler :help 'scs'
Durch geeignete Präfixe vor dem zu suchenden Begriff kann man steuern, für welchen Funktions-Bereich des Vim gesucht werden soll:
Bereich | Präfix | Beispiel |
---|---|---|
Kommandos des Normal-/Kommando-Modus | nichts | :help x |
Kommandos des visuellen Modus | v_ | :help v_u |
Kommandos des Einfüge-Modus | i_ | :help i_<Esc> |
Kommandozeilen-Kommandos | : | :help :quit |
Kommandozeilen-Edititierung | c_ | :help c_<Del> |
Vim-Argumente | - | :help -r |
Optionen | ' | :help 'textwidth' |
die Hilfetexte sind einfache Text-Dateien, die man leicht durchsuchen kann
auf der Basis des Tags-Mechanismus existieren Verknüpfungen zwischen den Hilfethemen (also eine Art Hyperlinks):
vorwärts | Ctrl-] |
rückwärts | Ctrl-T |
man kann im Einfüge-Modus normal mit den Cursor-Tasten arbeiten
die Kommando-Zeile bietet Editiermöglichkeiten und eine History sowie die Möglichkeit der Vervollständigung über Tab
Vim kann Binär-Dateien editieren
vi -b datei
so kann man z.B. die Datei appreg von Mozilla ändern
Vim hat einen eigenen einfachen Datei-Browser bzw. -Explorer
diesen kann man durch das Kommando :Exp oder durch Angabe eines Verzeichnis-Namens statt eines Datei-Namens als Argument starten
Vim kann aus der Standardeingabe lesen:
diff -u alt neu | vi -
Vim kann sich in der Viminfo-Datei seinen aktuellen Zustand (Inhalte von Registern und History-Listen, Marken, Such-/Ersetzungs-Muster, Puffer-Liste und globale Variablen) automatisch über Sitzungen hinweg merken
Standard-Name der Viminfo-Datei:
UNIX | $HOME/.viminfo |
Windows | $HOME\_viminfo |
bs backspace |
Wert indent,eol,start (bzw. die alte Angabe 2) gestattet beliebiges Rückwärtslöschen im Einfüge-Modus |
ru ruler |
Anzeige Zeile, Spalte und relative Anzeigeposition (in %) bei Tabs in Zeile: getrennte Anzeige der logischen und physischen Position |
ic ignorecase |
keine Unterscheidung Groß-/Kleinschreibung beim Suchen |
scs smartcase |
ignoriert ignorecase, falls Suchmuster auch Großbuchstaben enthält |
wmnu wildmenu |
erweiterter Modus der Kommandozeilen-Vervollständigung mit Tab, in dem alle Treffer in einem Menü angezeigt werden |
smd showmode |
aktuellen Vim-Modus anzeigen (EINFÜGEN, ERSETZEN, ...), sofern er vom Kommando-Modus abweicht |
wrap | lange Zeilen immer komplett anzeigen (also ggf. über mehrere Bildschirm-Zeilen) |
paste | ändert mehrere Optionen, die für das Einfügen von Text via Maus geeignet sind |
tw textwidth |
Textbreite für automatischen Zeilenumbruch |
wm wrapmargin |
Anzahl Zeichen vom rechten Rand für Zeilenumbruch |
list | (farbige) Anzeige von Tabs als ^I und Zeilenende als $ |
et expandtab |
statt Tabs eine Folge von Leerzeichen einfügen Tab-Eingabe durch Ctrl-V Tab mit :retab kann man eine neue Einstellung von expandtab im aktuellen Puffer wirksam werden lassen |
ts tabstop |
Anzahl Leerzeichen, die einem Tab entsprechen |
ss sidescroll |
Minimalanzahl Spalten für horizontales Scrollen (bei nowrap) |
:set ru
:set noru
Präfix no schaltet eine Option ab
:set ru?
Suffix ? kann entfallen, wenn es sich um eine binäre Option handelt, die nur ein- oder ausgeschaltet sein kann
:sy on :sy off :set syntax=wiki
Syntax-Datei für die im Beispiel verwendete Wiki-Syntax: wiki.vim
:help syntax beschreibt die umfangreichen Details
die automatische Auswahl der zu verwendenden Syntax basiert primär auf der Endung des Datei-Namens und teilweise auf der Analyse des Datei-Inhalts
bei aktiviertem Syntax-Highlighting werden mitunter Einstellungen von .vimrc verändert, z.B. textwidth bei Wiki-Dateien
mögliche Abhilfe: eigene Einstellungen in ~/.vim/after/plugin/after.vim vornehmen
Hinweis: Mit dem Kommando :scriptnames kann man sich eine Liste aller gelesenen Vim-Skripte anzeigen lassen, die nach der Einlese-Reihenfolge sortiert ist. Der erste Eintrag der Liste benennt also das zuerst gelesene Skript.
gestatten, bestimmte eingegebene Tastenfolgen auf eine bestimmte Zeichenfolge abzubilden
Mappings sind Modus-bezogen, d.h., man kann Mappings auf bestimmte Modi begrenzen (z.B. Einfüge-Modus, Visual-Modus, Kommandozeilen-Modus)
Beispiel-Zeile aus .vimrc:
map <F2> :set syntax=wiki^M
Dezimal-Code | Ctrl-V Dezimal-Code |
Hexadezimal-Code | Ctrl-V x Hexadezimal-Code |
Beispiele für die Eingabe des Zeichens A mit Dezimal-Code 65 und Hexadezimal-Code 0x41:
Ctrl-V 065 Ctrl-V 65 ENTER Ctrl-V x 41
Die gezeigten Leerzeichen sind nicht einzugeben. Sie dienen nur der Übersichtlichkeit der Beschreibung. Nach 3 Dezimal-Ziffern wird das entsprechende Zeichen automatisch eingefügt. Bei Verzicht auf Vornullen kann man durch ENTER das Einfügen des Zeichens erreichen.
Auch auf der Vim-Kommandozeile und somit z.B. bei der String- bzw. Muster-Suche mit / und ? kann man die Eingabe über Codes nutzen.
Auto-Kommandos kann man in der Datei .vimrc vereinbaren
Beispiel: Bearbeitung von mit gzip/bzip2/compress komprimierten Dateien, also automatisches Dekomprimieren vor dem Editieren und automatisches Komprimieren nach dem Abpseichern:
augroup gzip autocmd! autocmd BufReadPre,FileReadPre *.gz,*.Z,*.bz2 set bin autocmd BufReadPost,FileReadPost *.gz,*.Z '[,']!gunzip autocmd BufReadPost,FileReadPost *.bz2 '[,']!bunzip2 autocmd BufReadPost,FileReadPost *.gz,*.Z,*.bz2 set nobin autocmd BufReadPost,FileReadPost *.gz,*.Z,*.bz2 execute ":doautocmd BufReadPost " . expand("%:r") autocmd BufWritePost,FileWritePost *.gz,*.Z,*.bz2 !mv <afile> <afile>:r autocmd BufWritePost,FileWritePost *.gz !gzip <afile>:r autocmd BufWritePost,FileWritePost *.bz2 !bzip2 <afile>:r autocmd BufWritePost,FileWritePost *.Z !compress <afile>:r autocmd FileAppendPre *.gz,*.Z !gunzip <afile> autocmd FileAppendPre *.bz2 !bunzip2 <afile> autocmd FileAppendPre *.gz,*.Z,*.bz2 !mv <afile>:r <afile> autocmd FileAppendPost *.gz,*.Z,*.bz2 !mv <afile> <afile>:r autocmd FileAppendPost *.gz !gzip <afile>:r autocmd FileAppendPost *.bz2 !bzip2 <afile>:r autocmd FileAppendPost *.Z !compress <afile>:r augroup END
Diese Kommandos gestatten in der Regel die Angabe einer ganzen Zahl n vor dem Kommando, die angibt, wie oft die Operation ausgeführt werden soll. Fehlt diese Zahl, wird in der Regel implizit eine 1 angenommen.
X | lösche ein Zeichen nach links |
xp | vertausche Zeichen mit rechtem Nachbarn |
ddp | vertausche aktuelle Zeile mit ihrem Nachfolger |
~ | Groß- in Kleinbuchstaben bzw. umgekehrt wandeln |
f< | Cursor vorwärts bis Zeichen < |
2f< | Cursor vorwärts bis zum 2. Auftreten von Zeichen < |
t< | Cursor vorwärts bis vor Zeichen < |
F< | Cursor rückwärts bis Zeichen < |
T< | Cursor rückwärts bis hinter Zeichen < |
; | wiederhole letztes Kommando t, T, f, F |
, | wiederhole letztes Kommando t, T, f, F in entgegengesetzter Richtung |
df< | löschen nach rechts bis Zeichen < |
dt< | löschen nach rechts bis vor Zeichen < |
cf< | tausche nach rechts bis Zeichen < |
ct< | tausche nach rechts bis vor Zeichen < |
d0 | lösche rückwärts bis Zeilenanfang |
d^ | lösche rückwärts bis zum ersten Nicht-Whitespace-Zeichen der Zeile |
d} | lösche bis Absatzende |
. | Wiederholung des letzten Modifikations-Kommandos |
yy | aktuelle Zeile in Zwischenpuffer kopieren |
5p | Zwischenpuffer 5 Mal darunter bzw. dahinter einfügen (bei Vi ohne Anzahl) |
P | Zwischenpuffer 1 Mal darüber bzw. davor einfügen |
o | leere Zeile unter der aktuellen einfügen |
O | leere Zeile über der aktuellen einfügen |
mit m gefolgt von einem Buchstaben kann man die aktuelle Textposition markieren
Rücksprung an die Marke a:
`a | springt genau an die markierte Position |
'a | springt zum ersten Nicht-Blank-Zeichen der markierten Zeile |
mit `` oder '' kann man zur Position vor dem letzten Sprung-Kommando zurückkehren
u | Undo |
:redo | Redo |
Ctrl-R | Redo |
Vim zeichnet automatisch alle Editier-Aktionen in einer Swap-Datei auf
wenn man die Datei bbb editiert, heißt die Swap-Datei normalerweise .bbb.swp
mit vim -r kann man den Recovery-Modus starten, der auf Basis existierender Swap-Dateien den letzten gespeicherten Stand wiederherstellt
Beispiel: vim -r bbb
:n | 1 Datei vorwärts |
:N | 1 Datei rückwärts |
:3n | 3 Dateien vorwärts |
:4N | 4 Dateien rückwärts |
:rew | an den Anfang (rewind) |
:last | ans Ende |
:files | Datei-Liste anzeigen |
Ctrl-N | next: Wort-Vervollständigung durch Vorwärts-Suche im Inhalt aller Puffer |
Ctrl-P | previous: Wort-Vervollständigung durch Rückwärts-Suche im Inhalt aller Puffer |
gf | editiere Datei, deren Name unter dem Cursor steht |
* | suche Wort unter Cursor vorwärts |
# | suche Wort unter Cursor rückwärts |
Folgende Kommandos gestatten eine spezifische Suche/Vervollständigung:
Ctrl-X CTRL-F | Datei-Namen (Einträge im Datei-System) |
Ctrl-X CTRL-L | ganze Zeilen |
Ctrl-X CTRL-D | Makro-Definitionen (auch in Include-Dateien) |
Ctrl-X CTRL-I | aktuelle Datei und eingeschlossene Dateien |
Ctrl-X CTRL-K | Wörter aus einem Wörterbuch |
Ctrl-X CTRL-T | Wörter aus einem Thesaurus |
Ctrl-X CTRL-] | Vim-Tags |
Ctrl-X CTRL-V | Vim-Kommandozeilen-Befehle |
Bei all diesen Vervollständigungen kann man mit Ctrl-N das nächste und mit Ctrl-P das vorige passende Wort finden. Dies gestattet ein bequemes Durchlaufen der Liste aller passenden Einträge.
V | zeilenweise |
v | zeichenweise |
Ctrl-V | blockweise |
gv | letzte Markierung nochmal aktivieren |
d | löschen |
x | löschen |
y | in den Zwischenpuffer kopieren |
c | ändern |
> | nach rechts verschieben |
< | nach links verschieben |
~ | Wechsel zwischen Groß- und Kleinschreibung |
! | durch externes Kommando filtern |
gq | formatieren (Blocksatz) |
g? | mit Rot13 ver-/entschlüsseln |
:r!date | unterhalb der aktuellen Zeile die Ausgabe von date einlesen |
!!pwd | aktuelle Zeile durch Ausgabe von pwd ersetzen |
:%!sort -u | gesamten Puffer an sort -u übergeben und durch dessen Ergebnis ersetzen |
:sh | Sub-Shell starten dort kann man z.B. eine Datei schreibbar machen (mit chmod unter UNIX oder mit fs sa im AFS) |
:!ls | Kommando ls ausführen |
:pwd | aktuelles Verzeichnis ermitteln |
1 Ctrl-G | vollen Pfad der editierten Datei anzeigen |
g Ctrl-G | gibt die aktuelle Zeile, Spalte, Wortnummer und Zeichenzahl an |
ga | informiert detailliert über das Zeichen unter dem Cursor |
% | Prozentangabe des Status ist auch für Cursor-Positionierung im Kommando-Modus nutzbar, z.B. 30% |
:di | steht für display: Registeranzeige, u.a. Anzeige des Zwischenpuffers |
zt | an den oberen Bildschirmrand |
zz | in die Mitte des Bildschirms |
zb | an den unteren Bildschirmrand |
gg | gehe zu ersten Zeile (wie 1G) |
G | gehe zur letzen Zeile |
12G oder 12gg | gehe zur Zeile 12 |
85| | gehe zur Spalte 85 |
25go | gehe zur Byteposition 25 |
gq} | Formatieren bis Absatzende (Blocksatz) |
:map <C-J> gq} | Ctrl-J wirkt dann wie Justify bei Pico/Pine |
Ctrl-A | eine Zahl (Standard: 1) zur Zahl unter dem oder rechts vom Cursor addieren, z.B. 5Ctrl-A |
Ctrl-X | eine Zahl (Standard: 1) von der Zahl unter dem oder rechts vom Cursor subtrahieren, z.B. 5Ctrl-X |
qa | Start Aufzeichnung in Register a |
q | Stopp der Aufzeichnung |
5@a | 5-maliges Ausführen des Registers a |
:split | Fenster horizontal teilen |
:vsplit | Fenster vertikal teilen |
:ba | allen Datei-Argumenten ein eigenes Fenster zuordnen |
:on | only window: aktuelles Fenster wird zum einzigen offenen Fenster |
:hide | aktuelles Fenster verstecken |
Ctrl-W W | Wechsel zum nächsten Fenster |
:qa! | alle Fenster und damit den Vim bedingungslos schließen |
:xa | alle modifizierten Puffer sichern und dann Vim beenden |
:wa | alle Puffer schreiben |
q: | öffnet Fenster für Historie der :-Kommandos |
q? | öffnet Fenster für Historie der ?-Kommandos |
q/ | öffnet Fenster für Historie der /-Kommandos |
man kann die jeweilige Historie mit Vi-Mitteln bearbeiten und dann ein bestimmtes Kommando ausführen, indem man in der betreffenden Zeile ENTER drückt
Abbruch mit Ctrl-C
:g/^$/d | löscht alle Leerzeilen |
:%s/^/Ctrl-VCtrl-M | fügt vor jedem Zeilenanfang eine Zeilenschaltung ein |
:v/^abc/s/^/xxx | fügt am Anfang aller Zeilen, die nicht mit abc beginnen, xxx ein |
g?? | aktuelle Zeile mit Rot13 kodieren |
g?} | vom Cursor bis zum Absatzende mit Rot13 kodieren |