Vim ist ein vielseitiger Editor, der sich über Makros erweitern läßt. Er bietet /SyntaxHighlighting und eine grafische Oberfläche basierend auf GTK. Diese heißt gvim. Die KDE-Version hieß Kvim, war aber meistens buggy, und wird auch schon einige Jahre nicht mehr weiterentwickelt. Die Entwickler stecken die Arbeit jetzt in ein Projekt namens Kyzis. Ansonsten kann man aber die grafische GTK-Oberfläche auch unter KDE verwenden.
Der Vim ist ein Klon des original vi.
Homepage: http://www.vim.org/
Lizenz: Vim-Lizenz
Es gibt auch ein recht gutes Online-Buch (en) im PDF-Format über Vim, siehe dort auch insbesondere die Programmiertipps ab S.67.
Inhaltsverzeichnis
Vim - das Überlebensnotwendige
- Aufruf:
vim datei.txt 1
- Moduswechsel im Editiermodus:
i - Insert-Modus (Texteinfüge-Modus) anschalten. Wichtig: vorher keinen Text eingeben!
<Esc> - Insert- oder Replace-Modus verlassen, zurück in Kommandomodus
- im Kommandomodus:
:w - speichern
:q - beenden (wenn man nichts geändert bzw. bereits gespeichert hat)
:q! - beenden ohne speichern, Änderungen verwerfen
So, soviel zum Überlebensnotwendigen mit Vim.
Weitere Befehle
- Aufruf:
vim +123 buggyprogram.c, um direkt zu Zeile 123 zu springen
- im Kommandomodus:
u - Undo. Letzte Änderung zurücknehmen.
i - In den Insert-Modus wechseln ("insert"), Einfügestelle ist vor der aktuellen Position
a - In den Insert-Modus wechseln ("add"), Einfügestelle ist nach der aktuellen Position
A - In den Insert-Modus wechseln ("Add"), Einfügestelle ist am Ende der aktuellen Zeile
R - In den Überschreib-Modus wechseln ("Replace")
G - An das Ende der aktuellen Datei springen ("goto")
gg - An den Anfang der aktuellen Datei springen
nG oder ngg- Gehe zur Zeile n
d - Löschen ("delete"). Anwendung siehe unten
c - Ersetzen ("change"). Anwendung siehe unten
y - In den Textpuffer kopieren ("yank"). Anwendung siehe unten
p - Textpuffer nach aktueller Zeile einfügen ("put")
P - Textpuffer vor aktueller Zeile einfügen ("Put")
<Strg-w> v - Fenster vertikal teilen
<Strg-w> w - Cursor in das nächste Fenster
<Strg-w> W - Cursor in das vorherige Fenster
/<RegExp> vorwärts suchen
?<RegExp> rückwärts suchen
- Befehle mit "bis-Angaben":
d Löschen
c Ersetzen
y Kopieren in Puffer
- "bis-Angaben" am Beispiel von d (Löschen) erklärt. Gilt analog auch für c (Ersetzen) y (in Puffer kopieren)...:
3dd - 3 mal Löschen der aktuellen Zeile (Befehl 'd' wird wiederholt)
4d - 4 Zeichen löschen (nach 'd' steht ein Leerzeichen ' ')
2dw - 2 Wörter ('w') löschen
d$ - Löschen bis Zeilenende
d0 - Löschen bis Zeilenanfang
d/abc/ - Löschen bis zum Text "abc" ("abc" wird nicht gelöscht)
df= - Löschen bis zum Zeichen '=' (nur innerhalb der aktuellen Zeile). '=' wird mitgelöscht. Wenn kein '=' in der Zeile, passiert nichts
dG - Löschen bis Dateiende
dgg - Löschen bis Dateianfang
- Einzelzeichenbefehle:
x - aktuelles Zeichen löschen
fx - auf das Zeichen x (nach rechts) positionieren (x kann jedes Zeichen sein)
Fx - auf das Zeichen x (nach links) positionieren (x kann jedes Zeichen sein)
rx - das aktuelle Zeichen mit x ersetzen (x kann jedes Zeichen sein)
- Positionierungen
0 - (Ziffer '0'): an den Zeilenanfang gehen
n - Letzte Suche wiederholen ("next")
N - Letzte Suche rückwärts wiederholen
- Ex-Befehle
:split - Fenster horizontal teilen
:vsplit - Fenster vertikal teilen
:help - öffnet die Hilfe
:help <Befehl> - öffnet die Hilfe zu <Befehl>
:help holy-grail - zeigt alle Befehle an, die mit einem Doppelpunkt beginnen
:x - speichern und beenden
:123 - auf Zeile 123 springen
:$ oder G - an das Ende der Datei springen
:%s/<RegExp>/<String>/g im gesamten Text suchen und ersetzen
:s/<RegExp>/<String>/ in der aktuellen Zeile suchen und bei der ersten Übereinstimmung ersetzen
:s/<RegExp>/<String>/g in der aktuellen Zeile suchen und bei allen Übereinstimmungen ersetzen
Beispiele
- dd
- Löschen der aktuellen Zeile
- yy
- Aktuelle Zeile in den Kopierpuffer bringen
- 123G
- In Zeile 123 springen
- Einrücken (Indenting) oder Ausrücken (Dedenting) von Blöcken:
- V
- (ein paarmal Cursor runter, um den Block zu markieren)
> bzw. <
- ggg?G
Ein gg springt zum Kopf der Datei. Von da bis zum Ende wird die Datei mit Rot13 verschlüsselt.
:1,$ s/Hallo/Hello/g
- Zeile 1 bis letzte Zeile: Hallo durch Hello ersetzen, beliebig oft je Zeile.
- "%" ist mit "1,$" gleichbedeutend
:'a,'b s/Hallo/Hello/g
- von Marke a bis Marke b Hallo durch Hello ersetzen
.,.+3 s/1/2/
- Aktuelle Zeile bis 3 Zeilen weiter: 1 durch 2 ersetzen, nur das erste mal in der Zeile.
/^Name:/ s/Robby/Robert/g
- In jeder Zeile, in der am Anfang Name: steht, Robby durch Robert ersetzen, auch mehrmals.
Kleine Aufgaben mit vim erledigen
Suchen und Ersetzen in /etc/fstab
* alle Mounts sollen mit der Option "noatime" ergänzt werden:
Editor aufrufen: vi /etc/fstab
- alle "defaults" ersetzen durch "defaults,noatime:
:%s/defaults/defaults,noatime/
- %: alle Zeilen beachten
- s/defaults/defaults,noatime/: ersetze "defaults" durch "defaults,noatime"
- Alle NFS-Mounts deaktivieren (auskommentieren)
:/nfs/s/^//
- /nfs/: alle Zeilen behandeln, die "nfs" enthalten
s/^//: ersetzt den Zeilenanfang ("^") durch "#"
- IP-Adresse des NAS korrigieren
/cifs/
- Suchen nach dem Text "cifs". Es wird zur Zeile "#//192.168.2.3/nas /media/fritz cifs ... " gesprungen, das ist (wegen Kommentar) die falsche
n
- "n" (wie "next") springt zur nächsten Stelle mit "cifs", es wird gefunden: "//192.168.2.3/nas /media/fritz cifs ..."
0
- mit der 0 (die Ziffer 0) springt man an den Zeilenanfang
2f2
- der Cursor springt zur zweiten "2", also auf die 3.te Dezimalzahl der IP
cw44<ESC>
- cw ersetzt ein Wort, also hier die "2" mit dem Wert "44"
- Damit lautet die Zeile jetzt //192.168.44.3/nas /media/fritz cifs ... "
Mit vimtutor bekommt man eine Einführung in und im Vim.
Syntax-Highlighting
Zum Einschalten :syntax on im Editor oder syntax on in die .vimrc.
Syntax auswählen über :su $VIMRUNTIME/syntax/html.vim als Beispiel für HTML.
- Eigene Syntax Files kommen in ~/.vim/syntax/ .
Ein Beispiel für selbstgebautes Syntax-Highlighting findet sich auf ExternalEdit.
Automatische Einrückung
Kann man über die Optionen autoindent, smartindent und cindent steuern.
Wer etwa will das Tabs nur 4 Leerzeichen breit angezeigt werden sollte set tabstop=4 setzen und evtl. auch noch set shiftwidth=4 setzten damit auch im falle von cindent etc. richtig eingerückt wird.
Wenn man per X11 Copy&Paste Inhalte z.B. aus nem Web-Browser übernehmen will, sollte man autoindent vorher abschalten per :set noai - dann muss man nicht das ansonsten entstehende "Treppenmuster" entfernen.
"Top-Ten" der Vim Befehle
u Die undo Funktion ist immens wichtig. Schön ist auch, daß vim im Gegensatz zu vi mehr als eine Änderung rückgängig machen kann.
<STRG-p> bzw. <STRG-n> (also STRG-Taste und p oder n gleichzeitig) Ich editiere vor allem C/C++-Code und oft weiß ich 10 Zeilen später nicht mehr, ob ich die Variable jetzt vrglStr, vrglstring, vrgl_string oder vrgl_String genannt habe. Also im Code die Zeilen zurück, nachschauen usw.? NEIN, einfacher: Ich tippe vrgl (soweit kann ich mich noch erinnern ) und dann <STRG-p> - jetzt sucht Vim rückwärts nach Worten, die mit vrgl anfangen. Der erste Treffer wird angezeigt und ich kann einfach weiter schreiben. Würde es noch mehr Wörter geben, die mit vrgl anfangen, werden die der Reihenfolge nach angezeigt, ich muss nur nochmal <STRG-p> drücken. Das p steht für Previous. Wer das ganze mit <STRG-n> ausprobiert, sieht, dass n für Next steht, also einfach die Suchrichtung umgekehrt ist.
# und * Wenn der Cursor über einem Wort steht und Du drückst #, dann heißt das für den Vim "suche rückwärts nach diesem Wort und bringe den Cursor dort hin". * macht das gleiche, nur ist hier die Suchrichtung vorwärts.
% Steht der Cursor über einer Klammer, springt % zu der dazugehörigen öffnenden bzw. schließenden Klammer. Das funktioniert auch mit dem vi. Mit folgendem Skript http://www.vim.org/scripts/script.php?script_id=39 funktioniert das auch mit Sprachen, die andere Kontrollstrukturen haben, wie etwa TeX oder XML. Befindet man sich also über einem Tag und drückt % springt vim zum entsprechenden Gegenstück.
:%s/windows/linux/g Suchfunktion: windows suchen, durch linux ersetzen, g steht für alle Vorkommen in einer Zeile, % für den gesamten Text
v, V und ctrl-V Zeichen, Zeilen und Blockweises visuelles Markieren. Nach dem Markieren kann mit I Text eingefügt werden. c ändert den Markierten Text, x oder d löscht ihn und > und < rücken ihn ein.
= Dient der korrekten Ausrichtung von Programm Texten. Einfach mal =% oder == ausprobieren.
:noh Schaltet die Hervorhebung von Suchergebnissen ab, die bei kurzen Suchstrings sehr irritierend werden kann. Alternativ kann man auch nach einer definitiv nicht vorhandenen Zeichenfolge suchen (z.B. /cdnnsdcjsd).
Die ~/.vimrc bzw. ~/.gvimrc
Das sind die Konfigurationsdateien für den Vim. Beim Start des Gvim wird zusätzlich auch die ~/.gvimrc gesourced. Sind keine rc's im Homeverzeichnis, so werden die defaults durchlaufen. Bei Debian sind die in /etc/vim ansonsten im Installationsverszeichnis von Vim, das normalerweise /usr/share/vim ist. In der ~/.vimrc (hier ein Beispiel) und ~/.gvimrc lassen sich jetzt tolle Sache unterbringen, wie z.B. das bevorzugte Color-Scheme usw.
Plugins / Ftplugins
Vim unterstützt Plugins und zwar systemweit oder benutzerspezifisch. Es gibt davon inzwischen über 1200, siehe http://www.vim.org. Plugins gibts zu den verschiedensten Themen: CVS-Tools, Projekt-Verwaltung, Kalender, schon mal mit Vim Tetris gespielt?
Ftplugin bedeutet File-Typ spezifisches Plugin. So gibt es ftplugins die z.B. die Syntax von HTML oder Python oder usw. besonders unterstützen.
Es ist nicht schwer, sich einfache Plugins selber zu schreiben, z.B. um sich zusätzliche Menubars selber einzubinden.
Vim und Tabellen
Wer unter vim mit Tabellen arbeitet, wird Bedarf an Sortierfunktionen haben.
Das alphabetische Sortieren von Spalten beherrscht folgendes Script:
Es kann sogar Datumseinträge sortieren.
Das Sortieren von Spalten nach der Größe von Zahlen kann es nicht.
-> Eine diesbezügliche Ergänzung wäre toll. ;)
Da einige Webbrowser wie z. B. w3m das Einbinden von Editoren beherrschen, kann VIM natürlich auch "wiki". Ein kleines Skript für Wiki-Syntax gibt's ebenfalls.
Mit It's all text kann man in Firefox sehr bequem Texte in einem externen Editor bearbeiten.
Hilfe-System
Das Hilfesystem von Vim ist sehr leicht (natürlich wieder benutzerspezifisch) zu erweitern.
Weitere Links
Mit dem Aufbau von VIM-Makros beschäftigt sich Linux-Magazin.
kleine und gut verständliche Einführung in vi, aber auch für vim gültig: http://www.tripbit.org/articles/Der_vi_Editor_und_seine_Handhabung.htm
Folding, also das Zusammenfalten von Textpassagen bspw. anhand von geschweiften Klammern in C++, um Methoden auszublenden etc.: http://www.pl-berichte.de/t_programme/vim_fold.html
eine "Spickzettel"-Methode um den vi zu erlernen gibt es auch: http://gentoo.de/doc/de/vi-guide.xml
Tipps & Tricks
Debian
gvim funktioniert erst nach apt-get install vim-gtk. Allerdings schließt dies beispielsweise das Paket vim-perl (Vi IMproved mit Perl-Scripting-support) aus.
Navigation in langen Zeilen
Problem: Navigieren in langen Zeilen: Solange ich eine Zeile nicht mit Return abschließe, wird die ggf. auf dem Bildschirm automatisch umgebrochen, geht also z.B. über zwei Bildschirmzeilen. Die Tasten Pfeil-rauf, Pfeil-runter, Pos1 und Ende beziehen sich nun nicht auf die Bildschirmzeilen, sondern auf die tatsächlichen Zeilen (bis zum Zeilenende-Zeichen). Wie kann ich denn bequem die Bildschirmzeilen navigieren? Wie komme ich z.B. von der Bildschirmzeile 2 direkt zu dem auf dem Bildschirm darüberliegenden Zeichen? Bei "normalen" Textverarbeitungen ja mit Pfeil-rauf. Und bei vim?
Um sich in Bildschirmzeilen zu bewegen, kann man im Normalmodus
gj für abwärts und
gk für aufwärts benutzen.
Bei Bedarf kann man auch die Cursortasten entsprechend anpassen. (Siehe auch: Vim FAQ, Abschnitt 9.4)
Cream
Cream als einfache Konfiguration für Vim verwenden.
Pida
Pida ist eine grafische IDE, die als Editor einen VIM (alternativ auch Cream) eingebettet hat - und bietet viele Zusatzfeatures z.B. zum Thema Versionskontrolle etc. Pida IDE Website
cscope
cscope ist ein interaktives Programm zum navigieren im Quellcode. Als erstes wird im Quellcode-Verzeichnis mit dem Befehl cscope-indexer eine Datenbank (cscope.out) angelegt. Hier werden die Informationen der Codeanalyse gespeichert.
user@host:/tmp/codetest$ tree . `-- src |-- main.c `-- test.c user@host:/tmp/codetest$ cscope-indexer -r user@host:/tmp/codetest$ tree . |-- cscope.files |-- cscope.out `-- src |-- main.c `-- test.c
Nun startet wir vim im Verzeichnis in der sich die Datenbank befindet (/tmp/codetest).
user@host:/tmp/codetest$ vim
Zum erstellen einer Datenbankverbindung wird folgender Befehl eingegeben:
:cscope add .
Mit show lassen sich die Datenbankverbindungen anzeigen:
:cscope show
Nun wollen wir die main-Funktion suchen, dies wird mit folgendem Befehl gemacht:
:cscope find g main
vim öffnet die Datei in der sich die main-Funktion befindet und springt zu der richtigen Zeile.
Die Hilfe wird mit :cscope help angezeigt:
cscope Befehle: add : Eine neue Datenbank hinzufügen (Verwendung: add file|dir [pre-path] [flags]) find : Muster suchen (Verwendung: find c|d|e|f|g|i|s|t name) c: Find functions calling this function d: Find functions called by this function e: Find this egrep pattern f: Find this file g: Find this definition i: Find files #including this file s: Find this C symbol t: Find assignments to help : diese Nachricht anzeigen (Verwendung: help) kill : Verbindung abbrechen (Verwendung: kill #) reset: Verbindungen reinitialisieren (Verwendung: reset) show : Verbindungen anzeigen (Verwendung: show)
Humor
Das Kommandozeichen ! bedeutet soviel wie force - tippt mal :help! ein
Fragen
auf Systemen wo vim als default installiert ist, kann auch nur "vi" benutzt werden (1)