vi: Unterschied zwischen den Versionen
Michi (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Michi (Diskussion | Beiträge) |
||
Zeile 580: | Zeile 580: | ||
== Weblinks == | == Weblinks == | ||
{{Weblinks|{{url|US|Walter Alan Zintz|eng|http://www.networkcomputing.com/unixworld/tutorial/009/009.html|The vi/ex editor}} | |||
}} | |||
* [http://www.zdnet.de/builder/program/0,39023551,39124907-2,00.htm ViM für Programmierer] | * [http://www.zdnet.de/builder/program/0,39023551,39124907-2,00.htm ViM für Programmierer] |
Version vom 27. Dezember 2009, 22:23 Uhr
Der Texteditor vi ist eine "full screen"-Version des Zeilenditors ex. Auf modernen Linux-Distributionen ist "vi" in der Regel ein Link oder Alias auf vim.
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 mandurch Eingabe des Doppelpunkts. Der Cursor geht 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. |
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 | :set nolist |
:set sw 5 | Setzt Einrücklevel (shiftwidth) auf 5 Stellen | |
:set ai | (autoinsert) Automatisches Einrücken | :set noai |
:set number | (number) Anzeige der Zeilennummern | :set nonumber |
: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"
|
: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.
|
:w | Speichern der aktuellen Datei
|
:w !command | Schickt die aktuell von vi geöffnete Datei als Eingabe an den Befehl "command".
|
: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". |
: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 |
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
|
| | Bewegt den Cursor an den Anfang der aktuellen Zeile.
|
cc | Ersetzen des Texts der ganzen Zeile |
c | ersetzt Text ab der aktuellen Cursorposition wie folgt:
|
:y yy |
Kopiert aktuelle Zeile
|
y | (yank) kopiert Text ab der aktuellen Cursorposition wie folgt:
|
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
|
d | löscht nach dem aktuellen Cursor wie folgt:
|
e | Ersetzen des aktuellen Zeichens durch nächste Eingabe |
ma | Markierung einer bestimmten Position als Punkt "a".
|
x | Löschen des aktuellen Zeichens
|
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) |
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 Normalmodusvunmap
löscht alle Mappings für den Auswahlmodusounmap
löscht alle Mappings für den Operatormodusiunmap
löscht alle Mappings für den Einfügemoduscunmap
löscht alle Mappings für den Befehlszeilenmodusunmap
löscht alle Mappings für den Normal-, Auswahl- und Operatormodusunmap!
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 Befehlszeilenmodusiabbrev
oderiab
gilt für den Einfügemodusabbrev
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ügemoduscunabbrev
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ügemoduscunabbrev 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)
Weblinks
- ViM für Programmierer
- Vi/ViM notes
- Vim (Linuxwiki.de)
- VIM - der programmierbare Editor (Makros, Mappings, Mutationen) (Linux-Magazin / Andreas Kneib)
- The Vi editor (T-a-y-l-o-r.com)
Herausgeber | Sprache | Webseitentitel | Anmerkungen |
---|---|---|---|