vi: Unterschied zwischen den Versionen

Aus Mikiwiki
Wechseln zu: Navigation, Suche
(Optionen)
(Optionen)
Zeile 132: Zeile 132:
 
  $ <b>export EXINIT="set showmode,set ttytype"</b>
 
  $ <b>export EXINIT="set showmode,set ttytype"</b>
  
Falls die Variable "EXINIT" nicht bestimmt ist, so führt vi alle in der Datei "~/.exrc" (engl. ex run control) enthaltenen Befehle aus. Befindet sich allerdings eine Datei namens ".exrc" im aktuellen Verzeichnis und gehört auch dem aktuellen benutzer, so wird diese benutzt. Die Datei besteht aus einer einfachen Folge von [[ex]]-Befehlen, einer pro Zeile.
+
Falls die Variable "EXINIT" nicht bestimmt ist, so führt vi alle in der Datei "~/.exrc" (engl. ex run control) enthaltenen Befehle aus. Befindet sich allerdings eine Datei namens ".exrc" im aktuellen Verzeichnis und gehört auch dem aktuellen Benutzer, so wird diese benutzt. Die Datei besteht aus einer einfachen Folge von [[ex]]-Befehlen, einer pro Zeile.
  
 
Im Befehlsmodus können folgende [[ex]]-Befehle verwendet werden (siehe auch "man ex").
 
Im Befehlsmodus können folgende [[ex]]-Befehle verwendet werden (siehe auch "man ex").
Zeile 187: Zeile 187:
 
|-
 
|-
 
| <tt>:1,$ s/Suchmuster/Ersetzung/g<br>:% s/Suchmuster/Ersetzung/</tt>
 
| <tt>:1,$ s/Suchmuster/Ersetzung/g<br>:% s/Suchmuster/Ersetzung/</tt>
| Ersetzt in der ganzen Datei die Zeichenfolge "Suchmuster" durch die Zeichenfolge "Ersetzung". Beispiel zum Finden in den Zeilen 17 bis 64 des Musters "bgcolor=" und Löschen vom Muster bis zum Ende der Zeile.
+
| Ersetzt in der ganzen Datei die Zeichenfolge "Suchmuster" durch die Zeichenfolge "Ersetzung".
 +
 
 +
Beispiel zum Finden in den Zeilen 17 bis 64 des Musters "bgcolor=" und Löschen vom Muster bis zum Ende der Zeile.
  
 
  17,64 s/bgcolor=.*//
 
  17,64 s/bgcolor=.*//

Version vom 2. Januar 2019, 00:05 Uhr

Der Texteditor vi entstand 1976, als Bill Joy den Zeilenditor ex um einen "visual mode" erweiterte, was ein Navigieren im Text mittels eines Cursors erlaubte.

Aus vi entwickelten sich mehrere Erweiterungen und Portierungen auf andere Plattformen. Zu den bekanntesten Varianten gehören "vim" (vi improved) und "gvim", welche beide das Bedienkonzept über Modi und Tastenkombination unterstützen. "vim" bietet einen gegnüber vi beträchtlich erweiterten Funktionsumfang, während "gvim" zusätzlich eine grafische Benutzeroberfläche auf der Grundlage von GTK.

Auf modernen Linux-Distributionen ist "vi" in der Regel ein Link oder Alias auf vim. Auf BSD-Systemen gibt es daneben "nvi", bei Minix "elvis".

Konzept

Nach dem Starten von vi befindet man sich im Befehlsmodus. Hier kann Text positioniert oder gesucht werden, ausserdem können Befehle zur Textveränderung gegeben werden.

vi hat zwei Arbeitsmodi:

  • In den bildschirmorientierten Eingabemodus (vi-Modus) gelangt man durch Befehle wie "i" (insert), "a" (append), "c<Bereich>" (change) und "R" (replace). Hier kann Text eingegeben werden und mit der Rücktaste innerhalb der aktuellen Zeile korrigiert werden. Alle anderen Korrekturen und Massnahmen werden vom Befehlsmodus aus erledigt, in den man mit Escape zurückkehren kann.
  • In den zeilenorientierten Befehlsmodus (ex-Modus) gelangt man durch Eingabe des Doppelpunkts. Dieser Modus lässt sich einfach daran erkennen, dass er links unten keinerlei Statusmeldungen anzeigt. Der Cursor geht stattdessen in die unterste Zeile und erwartet einen durch "Return" abgeschlossenen Befehl. Teilweise entsprechen diese Befehle denen von "sed", sie betreffen vor allem den Text als Ganzes, z. B. das Sichern und Wechseln von Texten. Mit "q" (quit) wird das Programm verlassen.
                            _______________                  _______________
 |-------------- ex ------> | ex: Befehle |----- a,i,c ----> | ex: Eingabe |
 |     |-------- wq --------|_____________| <--- Return -----|_____________|
 |     |                      A    |    A
_|_____V_                     |    |    |
| shell |                     Q    vi   :
|_______|                     |    |    |
 A     |                    __|____V____|__                  _______________
 |     |-------- vi ------> | vi: Befehle |--- a,i,c,o,s --> | vi: Eingabe |
 |-------------- ZZ --------|_____________| <--- Escape -----|_____________|

Vim kennt fünf Betriebsmodi:

Betriebsmodus Wechsel aus Normalmodus Beschreibung
Normalmodus
(auch: Befehlsmodus)
Nach dem Editorstart befindet man sich im Normalmodus. Eine Rückkehr in den Normalmodus erfolgt durch Drücken der "Esc"-Taste, bis ein Piepston erklingt. Zentraler Modus, von dem aus man in die anderen Modi wechselt. Über verschiedene Tastaturbefehle kann Text verschoben, eingefügt ("i") und gelöscht ("x") werden. Dabei wird zuerst angegeben, wie oft der Befehl ausgeführt werden soll (ohne nähere Angaben genau einmal), danach folgt der Befehl.
Auswahlmodus
(auch: Visualmodus)
Drücken der Tasten "v", "Shift+v" oder "Ctrl+v". In der linken unteren Ecke erscheint der Text -- VISUELL -- . Hier können Bereiche zeichen-, zeilen- oder blockweise markiert werden können, um sie beispielsweise zu kopieren oder auszuschneiden. Markierter Text erscheint hervorgehoben.
Operatormodus In diesem Modus ist der Editor, wenn im Normalmodus ein Befehl angefangen wurde, aber noch die Angabe zur Bewegung fehlt. Wenn z. B. ein "D" eingegeben wurde, wartet vim auf eine Bewegungsangabe - das Programm läuft im Operatormodus. Beispielsweise mit "w" zum Löschen eines Worts oder "$" zum Löschen bis zum Zeilenende erhält vim die gewünschte Information.
Einfügemodus Drücken der Tasten "i" (insert), "a" (append) oder "o". In der linken unteren Ecke erscheint der Text -- EINFÜGEN --. Hier ist die Eingabe von Text möglich.
Befehlszeilenmodus
(auch: Kommandozeilenmodus)
Tippen eines Doppelpunkts (":"). Hinter dem Doppelpunkt können weitere Zeichen angegeben werden, wie etwa zum Suchen und Ersetzen. Wird direkt nach dem Doppelpunkt ein Ausrufezeichen geschrieben, so können beliebige Shell-Befehle ausgeführt werden. Der Befehl wird mit der "Return"-Taste ausgeführt oder mit der "Esc"-Taste abgebrochen, was in beiden Fällen zur Rückkehr in den Normalmodus führt.

Funktionen

Gegenüber dem ursprünglichen vi von Bill Joy weist vim eine ganze Reihe von Erweiterungen auf:

  • unbegrenztes Undo/Redo (u und Ctrl+r)
  • mehrere Fenster über- und nebeneinander
  • Fenstergruppen in Reitern
  • Syntax-Highlighting für über 500 strukturierte Formate, darunter über 42 Programmiersprachen
  • Vervollständigen von Namen, Wörtern oder Variablen im Quellcode
  • Vergleichen und Kombinieren von Dateien
  • Erweiterte reguläre Ausdrücke
  • Ein- und Ausklappen von Textblöcken ("folding")
  • Öffnen von komprimierten Dateien
  • Eingebauter Textumbruch
  • Integrierte Hilfsfunktion
  • Historie für Suche und Cursor-Positionen
  • Session-Datei mit Pufferlisten und Registerinhalten
  • Arbeiten mit Makros (Aufnehmen und Abspielen von Tastensequenzen)
  • Maus-Interaktion

Konfiguration

Bei vielen Linux-Distributionen ist "usr/bin/vi" lediglich ein symbolischer Link, der auf ein tatsächlich ausführbares Programm verweist. Unter Ubuntu weist dieser Link seinerseits auf den symbolischen Link "/etc/alternatives/vi", welcher wiederum auf die Datei "/usr/bin/vim.tiny" verweist. Sinnvolelrweise sollte hier "vim.basic" nachinstalliert werden.

Folgender Befehl zeigt alle Bibliotheken und Module, welche im aktuellen "vim" integriert sind.

$ vim --version

Optionen

vi versteht eine Reihe von Variablen (die mit ":echo" abgefragt werden können) wie "$VIMRUNTIME", "$HOME", "$USER", interne Variablen wie "v:errmsg" (enthält die letzte Fehlermeldung), globale und lokale Variablen sowie Skriptvariablen. Eine ausführliche Liste gibt der Befehl ":h internal-variables" aus.

vi besitzt verschiedene Variablen, mit denen das Programm konfiguriert werden kann.

Einschalten Bedeutung Ausschalten
:set all Zeigt die aktuellen Einstellungen
:set list Zeigt Sonderzeichen an (Zeilenende als "$", Tabulator als "^I") :set nolist
:set sw 5 Setzt Einrücklevel (shiftwidth) auf 5 Stellen
:set ai (autoinsert) Automatisches Einrücken :set noai
:set number Anzeige der Zeilennummern :set nonumber
:set showmode Anzeige des vi-Modus in der Statuszeile (INSERT, APPEND usw.). :set noshowmode
:set textwidth=80 Anzahl der Zeichen, aber der eine Zeile wortweise umbrochen wird.
:set wrap Anzeige der Zeilen mit Zeilenumbruch :set nowrap
:set wrapmargin=8 Erzeugt einen Rand von 8 Zeichen am Ende jeder Zeile.
:abbr short long Ersetzt den Ausdruck "short" gleich nach der Eingabe durch den Ausdruck "long"
  • :abbr kr Keith Richards ersetzt die Zeichenfolge "kr" durch "Keith Richards".
:unabbr short

Ist die Shell-Variable "EXINIT" gesetzt, wird die enthaltene Zeichenkette bei jedem Aufruf von vi als Befehlszeile angesehen (also als ob man ":" tippen and dann den Inhalt von "EXINIT" eingeben würde).

$ setenv EXINIT "set showmode"
$ export EXINIT="set showmode,set ttytype"

Falls die Variable "EXINIT" nicht bestimmt ist, so führt vi alle in der Datei "~/.exrc" (engl. ex run control) enthaltenen Befehle aus. Befindet sich allerdings eine Datei namens ".exrc" im aktuellen Verzeichnis und gehört auch dem aktuellen Benutzer, so wird diese benutzt. Die Datei besteht aus einer einfachen Folge von ex-Befehlen, einer pro Zeile.

Im Befehlsmodus können folgende ex-Befehle verwendet werden (siehe auch "man ex").

ex-Befehl Beschreibung
:e file Bearbeiten der Datei "file"
:q Beenden von vi (ohne zu speichern).
:! command Ruft eine shell auf, um den Befehl "command" abzusetzen
:r file Lädt den Inhalt der Datei "file" als nächste Zeile an der aktuellen Cursorposition hinzu
:r !command Fügt die Ausgabe des Befehls "command" an der aktuellen Cursorposition ein.
  • :r !date fügt das aktuelle Datum ein
  • :r !uname -a fügt die Systeminformationen ein
:w Speichern der aktuellen Datei
  • :w file speichert den aktuellen Status der Datei unter dem Dateinamen "file"
:w !command Schickt die aktuell von vi geöffnete Datei als Eingabe an den Befehl "command".
  • :w !lpr druckt die aktuelle Datei über "lpr" aus
  • :r !uname -a fügt die Systeminformationen ein
:x Speichern der aktuellen Datei und beenden von vi.
:wq Speichern der aktuellen Datei und beenden von vi (entspricht ":x").
:23 Setzt Cursor auf Anfang von Zeile 23
:4,9d Löscht die Zeilen 4 bis 9
:5!rev Führt den Befehl "rev" für Zeile 5 aus (womit die Zeichen der Zeile in umgekehrter Reihenfolge ausgegeben werden).
:1,$!tac Führt den Befehl "tac" für alle Zeilen von der ersten bis zur letzten aus (womit die Reihenfolge der Zeilen umgekehrt wird).
:5,9!tac Führt den Befehl "tac" für die Zeilen 5 bis 9 aus (womit Zeile 9 zu Zeile 5 wird, Zeile 8 zu Zeile 6, usw.).
:1,$ s/Suchmuster/Ersetzung/g
:% s/Suchmuster/Ersetzung/
Ersetzt in der ganzen Datei die Zeichenfolge "Suchmuster" durch die Zeichenfolge "Ersetzung".

Beispiel zum Finden in den Zeilen 17 bis 64 des Musters "bgcolor=" und Löschen vom Muster bis zum Ende der Zeile.

17,64 s/bgcolor=.*//
:1,$ s/Suchmuster/Ersetzung/gc Ersetzt nach Rückfrage in der ganzen Datei das Suchmuster durch die Ersetzung
:.,$ s/^/##/ Fügt von der aktuellen Zeile (.) her bis zum Zeilenende ($) am Zeilenanfang (^) die Zeichenfolge ## ein.
:s/Suchmuster/Ersetzung/g Ersetzt in der aktuellen Zeile das Suchmuster durch die Ersetzung.
:.,5w file Schreibt alle Zeilen ab der aktuellen Zeile bis Zeile 5 in die Datei "file".
:1,.-4w file Schreibt alle Zeilen ab der ersten bis zur vierten oberhalb der aktuellen Zeile in die Datei "file".
:.,.+3w file Schreibt alle Zeilen von der aktuellen bis zu den drei der aktuellen folgenden Zeilen in die Datei "file".
:.,9d Löscht ab der aktuellen Zeile bis Zeile 9
:4,$d Löscht ab Zeile 4 bis Dateiende
:.,$d Löscht ab der aktuellen Zeile bis Dateiende

Textnavigation

h ein Zeichen nach links
j eine Zeile nach unten
k eine Zeile nach oben
l ein Zeichen nach rechts
0 zum Zeilenanfang
^ zum ersten sichtbaren Zeichen der Zeile
$ zum Zeilenende
CTRL F (forward) eine Seite vorwärts
CTRL B (backward) eine Seite rückwärts
z RETURN aktuelle Zeile an den Bildschirmanfang
1G an den Dateianfang
G ans Dateiende
55G zu Zeile 55
b an den Beginn der vorhergehenden Zeichenfolge
B an den Beginn der vorhergehenden Zeichenfolge. Interpunktion wird nicht berücksichtigt.
e ans Ende der nächsten Zeichenfolge
E ans Ende der nächsten Zeichenfolge. Interpunktion wird nicht berücksichtigt.
w an den Beginn der nächsten Zeichenfolge
W an den Beginn der nächsten Zeichenfolge. Interpunktion wird nicht berücksichtigt.
fc nach rechts bis zum nächsten Zeichen c
Fc nach links bis zum nächsten Zeichen c
tc nach links bis auf das nächste Zeichen c
Tc nach rechts bis vor das nächste Zeichen c
) einen Satz vorwärts
( einen Satz rückwärts
} einen Abschnitt vorwärts
{ einen Abschnitt rückwärts
% springe zur zugehörigen Klammer
/muster RETURN Vorwärtssuche der Zeichenfolge muster ab aktuellem Cursor
/muster muster/ RETURN Vorwärtssuche der Leerzeichen enthaltenden Zeichenfolge muster muster ab aktuellem Cursor
?muster RETURN Rückwärtssuche der Zeichenfolge muster ab aktuellem Cursor
* RETURN Vorwärtssuche nach der Zeichenfolge unter dem aktuellen Cursor
# RETURN Rückwärtssuche nach der Zeichenfolge unter dem aktuellen Cursor
n
//
Gehe zum nächsten Vorkommen des Suchbegriffs im Text
N Gehe zum vorhergehenden Vorkommen des Suchbegriffs im Text

Textbearbeitung

a (append) Einfügen nach Cursor
A Einfügen am Zeilenende
i (insert) Einfügen vor Cursor
  • 77i- ESC fügt 77 Bindestriche vor dem Cursor ein
| Bewegt den Cursor an den Anfang der aktuellen Zeile.
  • 7| bewegt den Cursor in die 7. Spalte der aktuellen Zeile.
cc Ersetzen des Texts der ganzen Zeile
c ersetzt Text ab der aktuellen Cursorposition wie folgt:
  • cw bis zum Wortende
  • c$ bis zum Zeilenende
  • c| rückwärts bis zum Zeilenanfang
  • c{ rückwärts bis zum Abschnittanfang
:y

yy

Kopiert aktuelle Zeile
  • 4yy kopiert die aktuelle und die drei folgenden Zeilen
y (yank) kopiert Text ab der aktuellen Cursorposition wie folgt:
  • y) bis zum Satzende
  • yw bis zum Beginn des nächsten Wortes
rA (replace) Überschreibt den Buchstaben an der aktuellen Cursorposition mit dem Buchstaben "A".
R (replace) Überschreibt Text ab der aktuellen Cursorposition, bis die Escape-Taste gedrückt wird.
J (join) Die folgende Zeile wird direkt an die aktuelle Zeile angefügt, der Zeilenumbruch dazwischen wird also entfernt.
:d
dd
Löscht aktuelle Zeile
  • 4dd löscht die aktuelle und die drei folgenden Zeilen
d löscht nach dem aktuellen Cursor wie folgt:
  • dl / x aktuelles Zeichen
  • dlp / xp vertauscht das aktuelle Zeichen mit dem folgenden
  • d{ bis zum Anfang des aktuellen Abschnitts
  • d} alle Zeichen bis zum Ende des aktuellen Abschnitts
  • d( alle Zeichen bis zum Anfang des aktuellen Satzes
  • d) alle Zeichen bis zum Ende des aktuellen Satzes
  • dw alle Zeichen bis zum Anfang der nächsten Zeichenfolge
  • 4dw alle Zeichen bis zum Anfang der vierten folgenden Zeichenfolge
  • d$ / D alle Zeichen bis zum Zeilenende
  • dgg alle Zeilen vom Dateianfang her
  • dG alle Zeilen bis zum Dateiende
D Löschen des Zeilenrests rechts vom aktuellen Cursor
e Ersetzen des aktuellen Zeichens durch nächste Eingabe
ma Markierung einer bestimmten Position als Punkt "a".
  • `a wechselt zum zuvor markierten Punkt "a".
  • y`a kopiert den Text von der aktuellen Cursorposition bis Punkt "a"
  • c`a ersetzt den Text von der aktuellen Cursorposition bis Punkt "a"
  • d`a löscht den Text von der aktuellen Cursorposition bis Punkt "a"
x Löschen des aktuellen Zeichens
  • xp tauscht das aktuelle Zeichen durch das folgende aus und umgekehrt
X Löschen des Zeichens links von der Schreibmarke
yy (yank) Kopieren der aktuellen Zeile in den Zwischenspeicher
p Inhalt des Puffers als neue Zeile nach der aktuellen Zeile einfügen
P Inhalt des Puffers als neue Zeile vor die aktuelle Zeile einfügen
. Wiederholung des letzten Befehls an der aktuellen Cursorposition (auch mehrmals möglich).
~ Änderung der Gross- und Kleinschreibung an der aktuellen Cursorposition.
u (undo) Rückgängigmachen des letzten Befehls (auch mehrmals möglich)
CTRL u (undo)Löscht die aktuelle Eingabe in der aktuellen Zeile
CTRL w (word) Löscht das letzte eingegebene Wort

Mappings

Mappings ermöglichen es, Tasten oder Tastenkombinationen mit neuen Funktionen zu belegen, Folgen von Tastatureingaben in Makros aufzuzeichnen oder über Abkürzungen Tipparbeit bei der Eingabe zu sparen. Autobefehle treten selbsttätig in Aktion, wenn bestimmte Ereignisse eintreten - etwa wenn eine neue Datei angelegt wird.

Mappings werden im Befehlszeilenmodus definiert. Innerhalb von "vi" liefert der Befehl :help map.txt eine Hilfe zum Mapping. Die Syntax für eine Mappingdefinition lautet:

Mapping-Befehl Kurzform Langform

Dabei steht als Mappingbefehl etwa "nmap" für ein Mapping, das im Normalmodus arbeitet. Die Kurzform definiert, welche Tasten gedrückt werden müssen, um den Mappingvorgang auszulösen. Die Langform beschreibt Tastendrücke, die ohne die Mappingdefinition für den entsprechenden Vorgang gedrückt werden müssten. Folgende Modi sind möglich:

  • c für den Befehlszeilenmodus
  • i für den Eingabemodus
  • n für den Normalmodus
  • o für den Operatormodus
  • v für den Auswahlmodus

Manche Tasten eignen sich nur bedingt für die Terminalemulation bzw. funktionieren nicht zuverlässig.

Umschreibung umschriebene Taste geeignet für Terminal
<Space> Leertaste ja
<CR> Eingabe ja
<Tab> Tab ja
<C-A> Ctrl+a ja
<Del> Löschtaste meistens
<Home>, <End> Anfang, Ende meistens
<Up>, <Down>, <Left>, <Right> Cursortasten meistens
<F1> F1 meistens
<BS> Backspace bedingt
<C-F1> Ctrl+F1 bedingt
<S-F1> Shift+F1 bedingt
<C-Up> Ctrl+Pfeil oben bedingt
<S-Up> Shift+Pfeil oben bedingt
<PageUp> Seite auf bedingt
<C-PageUp> Ctrl+Seite auf bedingt
<S-PageUp> Shift+Seite auf bedingt

Folgende Eingabe im Befehlszeilenmodus belegt die Funktionstaste "F2" im Normalmodus mit einem Befehl zum Speichern der gerade bearbeiteten Datei. Dabei werden "<F2>" und "<CR>" jeweils als vier einzelne Zeichen eingegeben und nichts als Druck auf die entsprechende Taste. Die Mappingdefinition wird durch Drücken der Return-Taste abgeschlossen und man kehrt in den Normalmodus zurück. Die Langform beginnt mit Doppelpunkt, damit vim in den Befehlsmodus wechselt. Da man sich beim (simulierten) Drücken der Taste "F2" im Normalmodus befindet, sollte der Editor nach Ausführen des Mappings auch dahin zurückkehren - das geschieht mit "<CR>".

nmap <F2> :w<CR>

Durch Eingabe von nmap <F2> in die Befehlszeile wird geprüft, ob vim die Mappingeingabe verstanden hat. Es sollte folgende Zeile zu sehen sein. Dabei bedeutet "n", dass das Mapping vom Normalmodus aus zu aktivieren ist, gefolgt von der eingegebenen Kurz- bzw. Langform. Es wäre also (abgesehen von zusätzlichem Leerform nach der Langform) zu sehen, ob etwas falsch eingegeben wurde.

n  <F2>          :w<CR>

Nach dem Betätigen der Taste "F2" kann man anhand folgender Meldung sehen, dass vim die Datei gespeichert hat:

"test" 462L, 8260C geschrieben

Die Kurzform eines Mappingbefehls kann auch mehreren Tastendrücken entsprechen. Der Punkt hat im Normalmodus noch eine andere Bedeutung: er wiederholt den letzten Änderungsbefehl. Wird später im Normalmodus ein Punkt getippt, so führt vim diesen eingebauten Befehl noch nicht aus - es könnte ja sein, dass ein zweiter Punkt (und schliesslich das "s") folgt. Passiert innerhalb der Pause nichts, dann nimmt vim an, dass der eingebaute Punkt-Befehl gemeint ist.

nmap ..s :w<CR>

Um die aktuelle Datei auch zu speichern, wenn man sich nicht gerade im Normalmodus befindet müssen weitere Mappings definiert werden. Folgendes Mapping eignet sich für den Auswahlmodus. Mit "gv" wird der Textbereich wieder markiert, dessen Auswahl vorher mit "<ESC>" aufgehoben wurde.

vmap <F2> <ESC>:w<CR>gv

Folgendes Mapping definiert das Speichern für den Operatormodus.

omap <F2> <ESC>:w<CR>

Folgendes Mapping definiert das Speichern für den Eingabemodus. Dabei wird der Eingabemodus mit "<ESC>" verlassen und nach dem Speichern mit "a" wieder aktiviert. Wird "i" statt "a" verwendet, so steht der Cursor nach Rückkehr in den Eingabemodus nicht mehr an der vorherigen Stelle, es sei denn, dass dies die erste Spalte war.

imap <F2> <ESC>:w<CR>a

Folgendes Mapping definiert das Speichern für den Befehlszeilenmodus. Mit "<ESC>" wird der aktuelle Inhalt der vim-Befehlszeile gelöscht, danach wird mit dem ersten ":" in den Befehlszeilenmodus zurückgekehrt. Nach dem Schreiben der Datei wird mit dem zweiten Doppelpunkt erneut in den Befehlszeilenmodus gewechselt, der vor dem Druck auf die Taste "F2" aktiv war.

cmap <F2> <ESC>:w<CR>:

Die Mappings für die fünf verschiedenen Modi sehen wie folgt aus:

nmap <F2> :w<CR>
vmap <F2> <ESC>:w<CR>gv
omap <F2> <ESC>:w<CR>
imap <F2> <ESC>:w<CR>a
cmap <F2> <ESC>:w<CR>:

Um einen Teil der Redundanz zu vermeiden, kann die definition der Taste "F2" für den Normalmodus in den anderen Mappings wiederverwendet werden. Das simulierte "<ESC>" aktiviert dabei den Normalmodus, sodass das jeweils folgende "<F2>" das Mapping für den Normalmodus nutzen kann.

nmap <F2> :w<CR>
vmap <F2> <ESC><F2>gv
omap <F2> <ESC><F2>
imap <F2> <ESC><F2>a
cmap <F2> <ESC><F2>:

Der Befehl ":map" definiert gleichzeitig Mappings für den Normal-, Auswahl- und Operatormodus. Da ein zusätzliches "<ESC>" für "nmap" nicht stört, können mit folgender Zeile die ersten drei Mappings ersetzt werden. Die Markierung im Auswahlmodus geht dabei beim Druck auf die Taste "F2" verloren. Der Text kann nach dem Speichervorgang über "g" "v" wieder ausgewählt werden.

map <F2> <ESC>:w<CR>

:map <F10> ^[wq schreibt und verlässt vi nach Drücken der F10-Taste. (Achtung: Zum Einfügen des Steuerzeichens "^[" muss zuerst "Ctrl V" und danach die Escape-Taste gedrückt werden)

Der Befehl ":map!" definiert gleichzeitig Mappings für den Einfüge- und den Befehlszeilenmodus.

map! <F2> <ESC>:w<CR>

Mit folgenden Befehlen wird man Mappings wieder los:

  • nunmap löscht alle Mappings für den Normalmodus
  • vunmap löscht alle Mappings für den Auswahlmodus
  • ounmap löscht alle Mappings für den Operatormodus
  • iunmap löscht alle Mappings für den Einfügemodus
  • cunmap löscht alle Mappings für den Befehlszeilenmodus
  • unmap löscht alle Mappings für den Normal-, Auswahl- und Operatormodus
  • unmap! löscht alle Mappings für den Einfüge- und den Befehlszeilenmodus

Abkürzungen

Abkürzungen (siehe dazu :help abbreviations) funktionieren ähnlich wie Mappings, lassen sich aber nur im Einfüge- oder Befehlszeilenmodus anwenden. Ein entsprechender Befehl wird mit folgender Syntax definiert:

Abkürzungsbefehl Kurzform Langform

Der Abkürzungsbefehl beginnt dabei mit einem Buchstaben, der anzeigt, für welchen Modus die Definition gilt:

  • cabbrev odercab gilt für den Befehlszeilenmodus
  • iabbrev oderiab gilt für den Einfügemodus
  • abbrev oderab gilt für beide Modi

Bei der Kurzform handelt es sich um das, was getippt wird, um die Ersetzung auszulösen. Die Langform beinhaltet, was vim für die Kurzform einsetzt.

Im Befehlszeilenmodus kann also folgender Befehl eingegeben werden:

iabbrev mfg Mit freundlichen Grüssen<CR>Willi Rüssel

Wird nun im Einfügemodus "mfg" eingegeben, so erscheint der definierte Text. Das funktioniert aber nur, wenn vim die Zeichenfolge "mfg" als eigenständiges Zeichenkette erkennt, also weder davor noch danach ein anderes alphanumerisches Zeichen steht: die Langform wird erst dann eingesetzt, wenn die Kurzform durch "Esc", Leerraum (etwa "Return") oder ein nicht alphanumerisches Zeichen abgeschlossen wird.

  • iunabbrev zeigt die definierten Abkürzungen für den Einfügemodus
  • cunabbrev zeigt die definierten Abkürzungen für den Befehlszeilenmodus

Nicht mehr gewünschte Abkürzungen werden wie folgt gelöscht:

  • iunabbrev xyz löscht die Abkürzung "xyz" für den Einfügemodus
  • cunabbrev xyz löscht die Abkürzung "xyz" für den Befehlszeilenmodus

Konfiguration

Als gute Vorlage für eine eigene Konfigurationsdatei "~./vimrc" kann die Datei "/etc/vimrc" dienen. Die Datei ".vimrc" bietet dabei nicht nur Platz für persönliche Einstellungen, sondern auch für eigene Makros, individuelles Syntaxhighlighting und vieles mehr.

Mögliche eigene Konfigurationsdatei "~/.vimrc".

"Syntaxhiglighting einschalten:
syntax on

"Zeilennummerierung anzeigen:
set number

"Während der Suche schon zum entsprechenden Text springen:
set incsearch

"Keine automatische Einrückung:
set nosmartindent

"Weise Taste F2 den Shell-Befehl "fmt" zu:
map <F2> !}fmt<CR>

"Rufe bei Druck auf F3 ispell mit Parametern auf:
map <F3> :w!<CR>:!ispell -T latin1 %<CR>:e! %<CR>

Verwendung

Aufruf im Lesen-und-Schreiben-Modus.

$ vi

Aufruf im Nur-Lesen-Modus.

$ view

Öffnen der Datei "file", wobei der Cursor auf Zeile 25 positioniert wird.

$ vi +25 file

Startet vi für alle auf ".c" endenden Dateien, welche die Zeichenfolge "waterDepth" enthalten.

$ vi $(grep -l waterDepth *.c)

Aufruf mit einer bestimmten Sprachumgebung (damit Sonderzeichen nicht als gefluchtete Zahlen angezeigt werden).

$ LANG=es_ES.ISO8859-1 vi

FAQ

Gross- und Kleinschreibung von aktuellem Zeichen vertauschen

~

Die Tastenfolge ist dabei: Esc, AltGr+~, Leerschlag. Zur Wiederholung kann mit den Pfeiltasten navigiert und dann die Taste "." gedrückt werden.

Ganze Zeile löschen, die einem bestimmten Muster (hier "*.foo.*") entspricht.

:g/.*foo.*/d

"Line too long"

Unter Solaris unterliegt "vi" offenbar einer Beschärnkung von höchstens 4'095 Zeichen pro Zeile. Wenn auch nur eine einzige Zeile einer Datei diese Anzahl Zeichen überschreitet, so kann "vi" die Datei nicht lesen und gibt aus: "Line too long".

Falls die Dateigrösse zu gross ist, so heisst die Fehlermeldung "Tmp file too large".

Unerwünschtes Hinzufügen der Zeichen A B C D

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
country US.gif Walter Alan Zintz eng The vi/ex editorwbm
country DE.gif Linux Magazin / Andreas Kneib ger Vim : der programmierbare Editor (Makros, Mappings, Mutationen)wbm
country DE.gif Linux User / Stefan Schwarzer ger Kleine Helfer : Aufgaben automatisieren in Vimwbm