1. Allgemeines
Vim ist ein Editor, kein Textverarbeitungsprogramm. Mit vim ist keine typographische Textgestaltung möglich, typische Textverarbeitungsfunktionen wie etwa Fußnotenverwaltung stehen nicht zur Verfügung. Vim dient ausschließlich zur Bearbeitung der "reinen" Textsubstanz. Es wird auch zur Erzeugung und Bearbeitung von Computercode (Programmen) eingesetzt.
Vim ist für alle gängigen Betriebssysteme kostenfrei verfügbar (https://www.vim.org/download.php). Es handelt sich um sog. "Charity Ware", d.h. die Nutzer werden zu einer Spende für einen guten Zweck aufgefordert.
Vim gilt als "sperrig" mit einer zunächst flachen, dann aber steil ansteigenden Lernkurve. Bei souveräner Beherrschung gilt er als besonders effizient und anderen Editoren überlegen.
2. Konfiguration
Die userspezifische Konfiguration von vim wird in der Datei _vimrc (unter Windows) bzw. .vimrc (unter Linux; im DHVLab ist eine geeignete Version im Ordner /files/courses/Korpling_MA abgelegt) festgelegt. "rc" steht für "run control". Sowohl unter Windows wie auch unter Linux muss die Datei im Homeverzeichnis des Users liegen (unter Windows normalerweise: c:\Benutzer\[Anmeldename]). Vim sollte niemals ohne eine an die persönlichen Erfordernisse angepasste vimrc-Datei verwendet werden. Der Inhalt der Datei wird von Vim beim Programmstart gelesen.
Die vimrc-Datei lässt sich am einfachsten editieren, indem man vim öffnet und dann den folgenden Befehl eingibt:
:e $MYVIMRC
" VIM-Konfigurationsdatei zur Verwendung auf Windows-Rechner. Abzuspeichern im Homeverzeichnis des Users (z.B. c:\users\[Benutzername] oder c:\Benutzer\[Benutzername] " Einzelne Zeilen können durch Voranstellung eines doppelten Anführungszeichens (") " deaktiviert bzw. durch deren Entfernung aktiviert werden " Download (Win): http://www.kit.gwi.uni-muenchen.de/wp-content/uploads/2015/03/_vimrc " Download (Linux): http://www.kit.gwi.uni-muenchen.de/wp-content/uploads/2015/03/.vimrc source $VIMRUNTIME/mswin.vim " Laden der VIM-Skript-Datei mswin.vim, die VIM so konfiguriert, dass es sich in wie von Windows-Programmen gewohnter Weise bedienen läßt (v.a. spezielle Tastenkombinationen wie z.B. ctrl-c ⇒ copy); funktioniert auch unter Linux-Systemen wie z.B. dem Desktop des dhvlab behave mswin " Windows-typisches Verhalten, d.h. von Windows-Usern gewohnte Tastenkombinationen funktionieren auch in VIM (z.B. ctrl-c ⇒ copy und ctrl-v ⇒ paste) set helplang=de " Sprache der Hilfefunktion. "de" meist wirkungslos, da nur Englisch verfügbar set history=200 " Anzahl der in der Datei _viminfo protokollierten Befehle und Suchmuster set hlsearch " Bei Suche nach Zeichenfolgen werden Treffer farblich hervorgehoben set incsearch " Bei Suche nach Zeichenfolgen wird jeweils der erste Treffer angezeigt, der dem bis dahin eingegebenen Suchmuster entspricht set keymodel=startsel,stopsel " set ruler " Anzeige von Zeilen- und Spaltennummer (rechts unten) set selection=exclusive set selectmode=mouse,key " Textmarkierung/-auswahl mit Maus und Tastatur set whichwrap=b,s,<,>,[,] set ignorecase " Groß-/Kleinschreibung bei Suchvorgängen irrelevant " set noignorecase " Groß-/Kleinschreibung bei Suchvorgängen relevant syntax enable " Farbliche Paraphrasierung von Code-Syntax. Weitere standardmäßig installierte Colorschemes: colorscheme desert " Farbschema mit schwarzem Hintergrund. Weitere normalerweise verfügbare Colorschemes: blue, default, desert, evening, industry, lunaperche, murphy, peachpuff, retrobox, shine, sorbet, wildcharm, zellner, darkblue, delek, elflord, habamax, koehler, morning, pablo, quiet, ron, slate, torte, zaibatsu " colorscheme default " Standard-Farbschema set fileformats=dos,unix,mac " Zeilenende-Kodierungen, die VIM beim Öffnen einer Datei berücksichtigt bzw. auf die eine Datei geprüft wird set fencs=utf-8,ucs-bom,latin1 " Zeichenkodierungen, auf die eine Datei beim Öffnen nacheinander getestet wird (in der gegebenen Reihenfolge) set encoding=utf-8 " Von VIM intern (z.B. beim Schreiben in die Datei _viminfo) verwendete Standardkodierung set fileencoding=utf-8 " Standardkodierung beim Speichern von Dateien set nu " Anzeige von Zeilennumerierung set tabstop=2 " Anzahl von Bildschirmspalten pro Tabstop set guifont=Courier_New:h12:cANSI " Auswahl des Fonts, der von gVim verwendet werden soll. Wichtig ist, dass dieser auf dem System auch verfügbar ist set autoindent " Automatische Übernahme der Zeileneinrückung bei Einfügen eines Zeilenumbruchs autocmd GUIEnter * simalt ~x " veranlasst gvim, mit maximiertem Fenster zu starten set foldenable set fdm=indent set expandtab " legt fest, dass Spaces anstelle von Tabs für Einrückungen verwendet werden set shiftwidth=2
Die installierten Colorschemes können mit folgendem Befehl angezeigt werden:
:colorscheme
gefolgt von "Space" gefolgt von ctrl+d
Sämtliche in der _vimrc festgelegten Einstellungen können während der Arbeit mit dem Programm jederzeit geändert werden. Anstelle von "set" kann auch die Kurform "se" verwendet werden.
# Anzeige von Zeilennummern: :se nu # Einschalten von Zeilennummern; :se nonu # Ausschalten # Einstellung der Dateikodierung :se fenc # Dateikodierung; vorzugsweise utf-8; weitere: latin1, utf-16, utf-32 etc. # Einstellung des Dateiformats (Auswirkung auf Kodierung des Zeilenendes) :se fileformat # dos, unix/linux, mac
- Manche Schriftarten stellen Sonderzeichen nicht dar (kleine Quadrate als Platzhalter). Eine große Anzahl von Glyphen enthält die Schrift Courier_New (wenigstens unter Windows).
- Farbschemata können ausgewählt werden über das Menü "Editieren" ⇒ "Farbschema ..." (alternativ durch das Kommando ":colorscheme [name des Farbschemas]")
3. Die "Modi" von Vim
Vim wird auch als "modaler" Editor bezeichnet, da er verschiedene "Modi" kennt. Am häufigsten verwendet werden die folgenden vier Modi.
3.1. Kommandomodus
Nach dem Start des Programms befindet sich vim im Kommandomodus. Dies lässt sich an der Gestalt des Cursors erkennen: Im Kommandomodus hat er die Form eines Rechtecks (s. Abb.). Im Kommandomodus haben sämtliche Tasten auf der Tastatur Sonderfunktionen.
Übersicht über die wichtigsten Tastenbefehle im Kommandomodus:
# Kommandomodus. Funktion der Tastenkombination "ga" ("get ascii value"). ga (Anzeige des Zahlenwerts des Zeichens, auf dem sich der Cursor befindet):
Das Drücken der Escape-Taste führt stets in den Kommandomodus.
3.2. Einfügemodus
Die Eingabe von Text ist nur im sog. Einfüge-Modus möglich. Um vom Kommandomodus in den Einfügemodus zu gelangen kann man folgende Tasten verwenden:
i # "insert"; Einfügemarke wird *vor* das Zeichen gesetzt, auf dem der Cursor steht a # "append"; Einfügemarke wird *hinter* das Zeichen gesetzt, auf dem der Cursor steht I # Einfügemarke wird an den Anfang der aktuellen Zeile gesetzt A # Einfügemarke wird an das Ende der aktuellen Zeile gesetzt o # "open"; Cursor am Anfang einer neue Zeile unterhalb der aktuellen Zeile O # Cursor am Anfang einer neue Zeile oberhalb der aktuellen Zeile
Im Einfügemodus ist er ein schmaler Strich ("Einfügemarke").
3.3. Visual mode
Der visual mode (visueller Modus) dient v.a. der Markierung von Text. Aus dem Kommandomodus gelangt man durch Drücken der Taste "v" in den visual mode. Führt man anschließend Cursorbewegungen aus, werden die entsprechenden Textpassagen markiert. Im visual mode können auch Suchen durchgeführt werden. Sämtlicher Text, der sich zwischen der Cursorposition und dem gematchten Suchstring befindet, wird markiert.
3.4. Kommandozeilen-Modus
In den Kommandozeilen-Modus gelangt man aus dem Kommandomodus durch das Drücken des Doppelpunkts (":"). Der Cursor springt in die linke untere Ecke des Vim-Fensters. Dort können nun einzeilige Kommandos eingegeben werden, die bei Drücken der Entertaste ausgeführt werden. Sehr häufig werden auf diese Weise Textersetzungen ausgeführt, z.B.:
:%s/alt/neu/gc
Mehrere solche Kommandos können durch das Pipe-Symbol ("|") mit einander verbunden werden. Sie werden dann beim Drücken der Entertaste nacheinander ausgeführt, z.B.:
:%s/alt/neu/g | %s/neu/neu2/g | w
4. Bewegen in der Datei, löschen, kopieren, einfügen
Im Kommandomodus gilt folgende Tastenbelegung:
gg # Cursor an den Anfang der Datei G # An das Ende der Datei 0 # An den Anfang der Zeile $ # An das Ende der Zeile dd # löscht die Zeile, in der sich der Cursor befindet 3dd # löscht die Zeile, in der sich der Cursor befindet und die zwei Zeilen darunter D # löscht den Zeileninhalt von der Position des Cursors bis zum Zeilenende yy # nimmt die Zeile, in der sich der Cursor befindet in den Zwischenspeicher p # setzt den Inhalt des Zwischenspeichers an der Stelle des Cursors ein o # erzeugt eine neue leere Zeile und wechselt in den Eingabemodus u # "undo" - macht Änderungen rückgängig. Mehrfaches Drücken von u geht in # in der Änderungshistorie zurück ctrl + r # "redo" - schreitet nach Verwendung von undo in der Änderungshistorie # wieder vorwärts
5. Öffnen, Speichern, Schließen
Kontextmenü in Windows ⇒ beliebige Dateien mit vim öffnen: Rechter Mausklick auf Dateisymbol ⇒ "Bearbeite mit Vim" / "Edit with vim":
# Öffnen einer Datei aus vim heraus: :e [Name der Datei, ggf. mit Pfad] # Speichern einer Datei: :w # Schließen/Verlassen einer Datei: :q # Schließen/Verlassen einer Datei erzwingen: :q! # Speichern und verlassen einer Datei: :wq
# Verkettung mehrerer Kommandos durch die "Pipe" (|) :%s/ab/cd/gc | se fenc=unix | w
6. Suchen
Nach Eingabe des Slash (/) im Kommandomodus können am unteren Fensterrand Suchmuster eingegeben werden. Die Suche erfolgt von der Stelle, an der sich der Cursor aktuell befindet nach unten. Bei Drücken des Fragezeichens (?) wird gleichfalls die Suchfunktion aufgerufen, die Suche erfolgt dann aber von der aktuellen Cursorposition nach oben. Alle Zeichenketten im Text, die dem Suchmuster entsprechen, werden farblich hervorgehoben. Zum Ausschalten dieser farblichen Hervorhebung muss im Kommandomodus :nohl ("no Highlighting") eingegeben werden.
Als Suchmuster können auch Reguläre Ausdrücke verwendet werden. Durch Drücken der Sterntaste (*) wird eine Suche ausgelöst, die das gesamte Dokument nach dem Token durchsucht, auf dem sich der Cursor gerade befindet. Bei jeder Suche werden die Treffer im Dokument farblich hervorgehoben. Durch Drücken der Taste n im Kommandomodus springt der Cursor zum jeweils nächsten Treffer in der Datei (N springt zum nächsten Treffer oberhalb).
# Finde alle Strings "Haus" /Haus # Suche nach Tokens, die aus exakt drei Zeichen bestehen /\<...\>
Die Berücksichtigung der Groß/Kleinschreibung kann beeinflusst werden durch die folgenden Kommandos:
:se ignorecase " keine Berücksichtigung :se noignorecase " Berücksichtigung
Reguläre Ausdrücke in VIM
Bei Verwendung von regulären Ausdrücken gelten im wesentlichen die üblichen Regeln. Allerdings gibt es einige VIM-spezifische Besonderheiten bzw. Erweiterungen. Zu den Besonderheiten gehört vor allem, dass eine Reihe von Metazeichen mit einem Backslash maskiert werden müssen. Sehr nützlich sind die folgenden zusätzlichen Metazeichen bzw. Metazeichenfolgen, die in der Standardsyntax der Regulären Ausdrücke fehlen:
\{-} ⇒ ein "nicht-gieriger" Wiederholungsoperator ("as few as possible") \_. ⇒ "any character including a newline"; ermöglicht zeilenübergreifende Suche
S. auch https://www.dh-lehre.gwi.uni-muenchen.de/?p=328&v=0#chapter:7-beispiele-fuer-res-nach-vim-syntax
Gut gemachte Dokumentationen zu den Regulären Ausdrücken in Vim:
- http://www.softpanorama.org/Editors/Vimorama/vim_regular_expressions.shtml
- https://www-user.tu-chemnitz.de/~hot/VIM/VIM/regexp.html
7. Ersetzen
Für Ersetzungen muss im Kommandomodus zunächst der Doppelpunkt (:) eingegeben werden. Anschließend können am unteren Fensterrand (= Kommandozeilenmodus) Suchmuster und Ersetzungsstrings eingegeben werden. Als Suchmuster können auch Reguläre Ausdrücke verwendet werden.
Allgemeine Syntax: :[Bereich]s/[Suchmuster]/[Ersetzung]/[Optionen] [Bereich]: 1,3 # Zeile 1 bis inkl. 3 4,$ # Zeile 4 bis zur letzten Zeile % # Alle Zeilen (alternativ: 1,$) leer oder . # aktuelle Zeile [Suchmuster]: Reguläre Ausdrücke [Ersetzung]: String [Optionen]: g ("global" - nicht nur erster Treffer in Zeile, sondern alle) c ("confirm" - Einzelbestätitigung => y = "yes", n = "no", a = "all", q = "quit")
# Einfaches Beispiel :s/Haus/Hof/c # Ersetzt (nur!) das erste Vorkommen innerhalb einer Zeile von "Haus" # durch "Hof"
Beispiele für Ersetzungsbefehle:
# Leerzeilen entfernen
:%s/\s*\n//gc
# Satzzeichen durch Leerzeichen von Wörtern isolieren # \(...\) definiert eine regex-Gruppe (s. Reguläre Ausdrücke) :%s/\([a-zäüöß]\)\([.,;?!:)\]]\)/\1 \2/gc
# XML-Tags entfernen
:%s/<\_.\{-}>//gc # \_. ⇒ "any character including a newline"
# Ersetzung von Zeichen unter Verwendung von deren hexadezimalen Zahlenwert
# Beispiel: Ersetze das "e" (hex 0065) durch "a":
:%s/\%u0065/a/gc
Sämtliche in einer Datei vorgenommenen Änderungen (Ersetzungen, aber auch manuelle Texteingaben) können durch Drücken des Buchstabens u im Kommandomodus rückgängig gemacht werden. Mit jedem weiteren Drücken des u werden weiter zurückliegende Änderungen des Textes rückgängig gemacht. Durch u rückgängig gemachte Änderungen, können durch ctrl-r wieder zurückgeholt werden.
8. Eingabe von Sonderzeichen
Im Einfügemodus kann wie gewohnt über die Tastatur Text eingegeben werden. Eine Besonderheit besteht in der Möglichkeit, Sonderzeichen über die Eingabe von deren Zahlenwert innerhalb der Unicode-Tabelle in ein Dokument zu schreiben. Zu diesem Zweck muss die Tastenkombination ctrl-q (je nach Konfiguration unter Umständen auch ctrl-v) gedrückt werden. Anschließend muss der Buchstabe "u" (für "unicode") gedrückt und dann der hexadezimale Zahlenwert des gewünschten Zeichens eingegeben werden:
ctrl-q (bei "behave mswin"; unter Linux auch ctrl-v) + u + [vierstellige Hex-Zahl] ODER ctrl-q + U + [achtstellige Hex-Zahl] Beispiel: ctrl-q + u + 0283 ⇒ LATIN SMALL LETTER ESH
9. Filtern von Zeilen
Analog zum Unix-Tool kann man in Vim Zeilen filtern, die bestimmte Zeichenmuster (regex) enthalten. Beispiel:
:vimgrep '^.* = text' % | cwin
Das Prozentzeichen (%) gibt an, dass der Befehl auf die komplette Datei angewendet werden soll. Teilbereiche einer Datei können nicht angegeben werden. cwin öffnet am unteren Bildschirmrand ein Fenster, indem die Zeilen angezeigt werden, die dem Suchmuster entsprechen. In diesem Fenster kann man sich mit den üblichen Befehlen bewegen. Drücken von ENTER bewirkt, dass der Cursor im Hauptfenster in die korrespondierende Zeile springt.
Alternativ kann das Kommando g:/ verwendet werden. Beispiel:
:g/^.* = text
Die Möglichkeiten sind gegenüber vimgrep aber eingeschränkt.
10. Nützliche Kommandos: Übersicht
-- Bearbeitung der persönlichen Konfigurationsdatei _vimrc (Linux: .vimrc) :e $MYVIMRC -- Steuerung der Case-sensitivity :se ignorecase " keine Berücksichtigung :se noignorecase " Berücksichtigung -- Eingabe von Zeichen über Unicode-Hexcode ctrl-q + u + [vierstellige Hex-Zahl] (Hex-Codes: https://www.fileformat.info/) -- Anzeigen des Codepoints ga # "get ascii" - Zeigt den Unicode-Zahlenwert des Zeichens unter dem Cursor -- Löschen von Zeilen mit Suchmuster :g/regex/d Beispiel :g/^listing.csv/d # löscht alle Zeilen, die mit dem String "listing.csv" beginnen :g!/^listing.csv/d # löscht alle Zeilen, die NICHT mit dem String "listing.csv" beginnen -- Wechsel in den Visuellen Modus (Markierung von Textpassagen) :shift+v (Bewegungs- oder Suchkommandos definieren Textauswahl) -- Anzeigen von Umgebungsvariablen :echo $ + ctrl-d
11. Hilfe
Vim verfügt über eine eingebaute Hilfefunktion. Diese ist sehr umfangreich und dadurch meistens eigentlich eher unbrauchbar. Der Aufruf erfolgt durch
:he [Stichwort] # (z.B. :he fileencoding)
Das [Stichwort] kann auch weggelassen werden. Dann wird die Startseite der eingebauten Dokumentation geöffnet.
:he
Die Hilfeseiten enthalten Hyperlinks, die daran erkennbar sind, dass die damit hinterlegten Stichwörter links und rechts von einem senkrechten Strich (sog. "Pipe") begrenzt sind. Ein Doppelklick auf die Stichwörter führt zu den entsprechenden Seiten innerhalb des Hilfekompendiums.
Die eingebaute Hilfe wird verlassen durch
:q ("quit")
Häufig führt eine Google-Suche am schnellsten zu einer gesuchten Lösung.
# Nützliche Seiten
12. Datei _viminfo
_viminfo (unter Linux: .viminfo): Datei im Homeverzeichnis (unter Windows normalerweise: c:\Benutzer\[Anmeldename]; unter Unix/Linux: /home/users/[Anmeldename]), in der sämtliche Kommandos (u.a. Befehle und Suchmuster) aufgezeichnet werden. Die Kommandos einer laufenden Bearbeitung werden erst in die Datei geschrieben, wenn die Bearbeitung einer Datei durch das Schließen des entsprechenden Fensters beendet wird.
13. Appendix: Historie von Vim
Die Anfänge von vim reichen in das Jahr 1976 zurück. Bis dahin wurden Texte auf Unix-Systemen überwiegend mit dem Editor ed bearbeitet, der stets nur eine einzige Zeile eines Textes auf dem Bildschirm anzeigte. Erst vi, der Vorläufer von vim, der ab 1976 von Bill Joy entwickelt wurde, führte die Möglichkeit ein, größere Passagen eines Textes auf dem Bildschirm darzustellen (vi = visual). Vim wurde dann von Bram Moolenaar als eine Weiterentwicklung des bis dahin nur auf Unix-Computern verfügbaren vi (vim = Vi IMproved, also "verbessertes" vi) ab Ende der 1980er Jahre zunächst für den Computer Amiga entwickelt. Die erste allgemein verfügbare Version von Vim erschien dann 1991, zunächst nur für den Amiga. Seither wurde das Programm stetig weiterentwickelt und steht nunmehr für die wichtigsten Betriebssysteme (Unix/Linux, Windows, Mac OS X) zur Verfügung.
Vim wurde zunächst nur innerhalb der sog. "Shell" verwendet. Die Shell ist ein auf nahezu allen Betriebssystemen vorhandenes Programm, das die Steuerung des Computers durch die Eingabe von Befehlen erlaubt. Mit dem Entstehen des Fensterkonzepts (zunächst Apple, dann Windows) wurde auch eine Fenster-Version von Vim entwickelt. Diese wird als gVim ("graphical Vim") bezeichnet.
Vim ist kostenfrei (eigentlich "charity ware"; es wird um Spenden für soziale Projekte gebeten) und open source-Software. Die jeweils aktuelle Version kann von www.vim.org heruntergeladen werden.