Freitag, 18. September 2009

VI - Visual Editor

VI - Visual Editor - der standard UNIX Editor





Der Linux/Unix standard Editor VI

VI (ausgesprochen: wie-ei) ist einer der ältesten Editoren unter UNIX bzw. Linux. Auch wenn es heutzutage per GUI einfachere und intuitiv zu bedienende "Luxus"-Editoren gibt, sind grundlegende Kenntnisse von VI ein großer Vorteil, vor allem dann, wenn man per PUTTY oder SSH nur einen remote Zugriff auf ein Linux/UNIX System hat oder das System einfach von einer Shell aus administrieren möchte.

VI entstand 1976, stammt also aus der Zeit der "Dump Terminals", der dummen seriellen Konsolen. Diese waren langsam und erlaubten gerade mal einfache Cursor-Positionierungen auf dem Bildschirm. Popup-Menüs und Maussteuerung waren darauf ausgeschlossen bzw. unbekannt. VI wurde für diese einfachen Bildschirm-Konsolen geschrieben. Seine Bedienung und sein Komfort orientieren sich daran und sind entsprechend einfach gehalten, aber letztendlich genial.
Der wesentliche Vorteil von VI ist, dass er auf fast jedem Linux/UNIX System anzutreffen ist. Dabei ist es nicht mal immer VI sondern oft ist vi nur ein Link auf einen seiner Clones, wie z.B Elvis oder VIM (VI-iMproved).
Der Lernaufwand lohnt sich für jeden User, der sich oft bzw. gern auf der Shell bewegt.

In VI gibt es 3 verschiedene Modi

Die Unterscheidung dieser drei Modi ist das "Hauptproblem" für den VI-Neuling. Hat er das einmal begriffen, läßt sich der Rest leichter verstehen/erlernen.

Diese Modi sind:
  1. Editiermodus: Mittels Editiermodus bewegt man sich durch den Text bzw. die Datei und führt Textkorrekturen aus.
    In diesen Mode geht VI, wenn er gestartet wird.
  2. Eingabemodus: in diesem Mode wird der Text eingegeben bzw. erfasst
  3. der "Last Line" - Kommandozeilen Modus: Zum Speichern, Beenden und komplexere Funktionen z.B. Suchen und Ersetzen

Wechsel zwischen den Modi

Input-Mode --- [ESC] ---> Edit-Mode -- : --> Last-Line-Mode
Input-Mode <-- i oder a -- Edit-Mode <-- [RETURN] -- Last-Line

Beim Aufruf von vi test.txt wird die Datei test.txt (sofern vorhanden) geöffnet und VI geht in den Edit-Mode.
Durch Eingeben von :q[RETURN] wird in den Kommandozeilen-Mode gewechselt VI beendet.
Im Edit-Mode werden die eingebenen Zeichen als Steuerzeichen interpretiert. Um Text schreiben zu können, muss man zunächst mittels i oder a in den Input-Mode wechseln. Im Input-Mode werden alle Zeichen als Text erfasst. Durch Dücken der Escape-Taste wird der Input-Mode beendet und man befindet sich wieder im Edit-Modus.

VI ist ein sehr mächtiger Editor mit ca. 200 Funktionen. Viele Tasten sind mehrfach belegt. So unterscheidet VI z.B. zwischen (Klein) o = Einfügen einer Zeile nach der aktuellen Zeile und (Groß) O = Einfügen vor aktueller Zeile. VI stammt eben aus der Zeit, als es kaum Alternativen zum Erstellen von Programm-Code gab. Heute verwendet man dazu meist Editoren auf der GUI wie z.B. Kate oder Geany, die auch syntaktische Prüfungen durchführen können oder die Code-Syntax farblich darstellen. VI ist und bleibt für die Shell der standard Editor.

Auch der Linux Page Reader "less" verwendet die Syntax der VI-Kommandos. Hier kann man sich mit VI-Kenntnissen leichter bewegen und Textstellen suchen.



VI - die Grundfunktionen

Für das "Gelegenheits-Editieren" z.B. zur Administration von Rechnern kommt man mit nachfolgenden, wenigen VI-Funktionen ganz gut aus.

Funktionen zum Speichern und Beenden von VI sind "Last Line"-Kommandos

TasteFunktion
:
Doppelpunkt im Edit Fenster startet den Last-Line-Mode
qQuitVI verlassen
q!QuitVI ohne Speichern verlassen/Verlassen erzwingen
wWriteDatei speichern
wqWrite & QuitZusammenhängen von w und q
/mustersuchesuche nach muster vorwärts
?mustersuchesuche nach muster rückwärts
nnextwiederhole letzte Suche

VI prüft vor dem Beenden, ob der Text verändert wurde und gibt eine entsprechende Warnung aus. Hat man eine Datei ohne Schreibberechtigung aufgerufen, oder möchte man die Änderungen verwerfen ohne zu speichern, so muss VI mit q! verlassen werden. Anderenfalls läßt sich VI nur nach vorherigem Speichern mit q beenden. Eine Alternative für :wq ist die Eingabe von ZZ.

Bewegen und Löschen im Edit-Modus
Bei den meisten Linux Systeme funktioniern die Cursor-Steuertasten einwandfrei. Falls das mal nicht der Fall sein sollte, kann man sich auch anders durch den Text bewegen.

FunktionZeichenWortZeileDatei
vorwärtslwjL
rückwärtshbkH
löschenxdwdd

TasteFunktion
0NULLGehe zum Zeilenanfang
$Zeilenendegehe ans Ende der Zeile
HHomegehe zum Anfang der Datei
LLastgehe zum Ende der Datei
12GGotogehe zu Zeile 12 der Datei (ohne Zahl = letzte Zeile)

Wechsel in den Input Mode:
TasteFunktion
iinsertText vor dem Cursor einfügen
IInsertText am Zeilenanfang einfügen
aappendText nach dem Cursor einfügen
AAppendText am Zeilenende anhängen
oopenLeerzeile/Text nach aktueller Zeile einfügen
OOpenLeerzeile/Text vor aktueller Zeile einfügen

Im Input-Mode werden Zeichen eingefügt (nicht überschrieben). Der Input-Mode wird mit Escape verlassen. Falls die Cursor-Tasten nicht oder schlecht implementiert sind, lösen sie u.U. Escape-Sequenzen aus, die VI veranlassen den Input-Mode zu beenden.


Spezielle Funktionen:
TasteFunktion
. wiederholt letztes Änderungskommando
uundomacht die letzte Änderung rückgängig
xx-enZeichen löschen (aus-X-en von Text)
rnreplaceErsetzt aktuelles Zeichen mit Zeichen n
xp tauscht aktuelles mit nachfolgendem Zeichen
JJoinhängt die nächste an die aktuelle Zeile an
löscht [Return] der aktuellen Zeile

Fast alle VI Funktionen können durch Voranstellen einer Zahl mehrfach ausgeführt werden. So löscht beispielsweise 12dd zwölf Zeilen ab der aktuellen Zeile.

Mit den oben aufgeführten Funktionen und dem Verständnis der drei Modi von VI lässt sich VI schon recht gut bedienen und produktiv einsetzen.




VI - mehr Funktionen

Wer mehr als nur gelegentlich mal eine Config-Datei editieren möchte, wird zusätzliche Funktionen benötigen: wie. z.B. Cut'n'Paste, suchen + ersetzen und Text überschreiben.
Die nachfolgenden Tabellen erheben keinen Anspruch auf Vollständigkeit. Sie sind entsprechend in "Funktionsgruppen" gegliedert. Fast alle VI-Kommandos können durch voranstellen einer Zahl entsprechend häufig ausgeführt werden. So ersetzt beispielsweise 15rx ab dem Cursor 15 Zeichen durch "x" oder 20~ dreht bei den nächsten 20 Buchstaben die Groß- Kleinschreibung um.

Yank und Put

Cut and Paste heißt in der VI-Sprache Yank und Put. Wobei das nicht ganz stimmt, den yank ist ein Copy-Befehl. Durch yy wird die aktuelle Zeile in den allgemeinen Puffer geschrieben. p für Put fügt den Puffer hinter der aktuellen Zeile ein. Das oben schon beschriebene dd Delete funktioniert ähnlich wie Yank, mit dem Unterschied, dass dd die entsprechende Anzahl Zeilen, nach dem Kopieren in den allgemeinen Puffer, löscht. Somit kann man die mit dd gelöschte(n) Zeile(n) an anderer Stelle im Text per p wieder einfügen.

Neben dem allgemeinen Pufffer kennt VI 35 weitere "benannte" Puffer. 26 davon sind über die Buchstaben a...z und 9 über die Ziffern 1...9 zu adressieren. Diese werden über "x[n]yy adressiert, wobei x der Buchstabe oder die Ziffer des Puffes ist und die Option n die Anzahl der zu kopierenden Zeilen ist. Ein vorangestelltes doppeltes Anführungszeichen teilt VI also mit, dass man einen benannten Puffer adressieren möchte.

Delete, Yank und Put in der Übersicht:
TasteFunktion
xlöscht aktuelles Zeichen
Xlöscht Zeichen vor Cursor
dwlöscht Wort
ddlöscht Zeile
d$löscht bis zum Ende der Zeile (alt: D)
d/musterlöscht bis muster
"addlöscht Zeile und speichert sie in Puffer a
ywkopiert Wort
yykopiert Zeile
y$kopiert bis zum Ende der Zeile
"ayykopiert Zeile in Puffer a
pfügt allg. Puffer hinter aktueller Zeile ein
Pfügt allg. Puffer vor aktueller Zeile ein
"apfügt Puffer a hinter aktueller Zeile ein
:r dateifügt datei zwischen aktueller und nächster Zeile ein

Aus der Tabelle kann man sehr schön erkennen, dass sich Funktionen in VI häufig aus anderen Funktionen zusammensetzen. So ist beispielsweise die Funktion xp zum Tauschen zweier hintereinanderliegender Buchstaben um z.B. aus einem "ie" ein "ei" zu machen, nichts anderes als die Funktion x (Löschen eines Zeichens) gefolgt von p (Einfügen hinter Cursor).

Suchen und Ersetzen

Suchen und Ersetzen wird im VI über "Last-Line" oder Doppelpunkt Kommandos durchgeführt. Das einfache Vor- und Rückwärtssuchen ist weiter oben schon aufgeführt. Delete, Yank und Put in der Übersicht:

Suchen:
EingabeFunktion
/mustersucht muster in Datei vorwärts
/muster/nsucht n-tes muster in Datei vorwärts
/muster/+npositioniere Cursor in n-te Zeile hinter muster
/muster/-npositioniere Cursor in n-te Zeile vor muster
?mustersucht muster in Datei rückwärts
nwiederholt letzte Suche
Nwiederholt letzte Suche in umgekehrter Richtung

Suchen und Ersetzen:
EingabeFunktion
s/alt/neuersetzt 1. Vorkommen in aktueller Zeile von alt durch neu
s/alt/neu/gersetzt alle Vorkommen in aktueller Zeile von alt durch neu
1,10s/alt/neu/gersetzt alle Vorkommen in Zeilen 1 bis 10 von alt durch neu
1,$s/alt/neu/gcersetzt alle Vorkommen in Datei von alt durch neu
inkl. Rückfrage. Diese muss mit y oder n beantwortet werden

In einem gut installierten VIM kann man, ähnlich wie bei der Bash, mittels Up- & Down-Cursor-Tasten durch die letzen Kommandos blättern und diese ggf. editieren und wiederholen.


Eingeben/Ändern mit Wechsel in den Input Mode:
TasteFunktion
aappendRechts vom Cursor einfügen
AAppendAm Zeilenende anhängen
iinsertLinks vom Cursor einfügen
IInsertAm zeielanfang einfügen
oopenöffnet neue, leere Zeile nach aktueller Zeile
OOpenöffnet neue, leere Zeile vor aktueller Zeile
ssubstituelöscht aktuelles Zeichen und geht in Input-Mode
SSubstitutelöscht aktuelle Zeile und geht in Input-Mode
RReplaceÜberschreiben einschalten
cwchange wordWort löschen und in den Input Mode wechseln
ccchangewie S - ganze Zeile ersetzen
c$Changeab Cursor den Rest der Zeile ersetzen
CChangewie c$ - ab Cursor den Rest der Zeile ersetzen

Ersetzungen/Änderungen ohne Wechsel in den Input Mode:
TasteFunktion
xaus-X-enZeichen unter Cursor löschen
rxreplaceZeichen unter Cursor durch x ersetzen
~Case changeWechsel von Groß- in Kleinbuchstaben und umgekehrt
JJoinZeilen verbinden
. letztes Änderungskommando wiederholen
uundoletzte Änderung rückgängig machen
:e! alle Änderungen seit dem letzten Speichern verwerfen



VI - Kommandozeilen Parameter

Beim Aufrufen von VI bzw VIM lassen sich einige Parameter gleich mit übergeben. Dies ist keine komplette Übersicht aller Möglichkeiten. Die Beispeile sollen proimär als Anregungen dienen:

EingabeFunktion
vi "+12" test.txtöffnet die Datei test.txt und positioniert Cursor auf Zeile 12
vi "+12" test.txt "+:4sp"öffnet die Datei test.txt in zwei Fenstern, wovon das obere 4 Zeilen hoch ist, den Fokus erhält und auf Zeile 12 positioniert wird.
Wird :sp ohne Zahl angegeben, so werden zwei gleich große Fenster geöffnet.
vi "+:6sp test.dat" test.txtÖffnet zwei Fenster, das obere ist 6 Zeilen hoch, hat den Fokus und enthält die Datei test.dat. Das untere enthält die Datei test.txt.
vi "+'\"" test.txtöffnet test.txt und geht zu der Zeile, in der der Cursor beim letzten Editieren stand.
kann man auch als Alias definieren: alias vi="vim \"+'\\\"\""
vi "+syntax on" "+set number" s.cschaltet beim Öffnen der Datei das Syntax Coloring und die Zeilennummerierung ein

Parameter, die man bei jedem Aufruf von VI verwenden möchte, wie z.B. set number sollte man in die Datei .vimrc im Home Verzeichnis des Users eintragen.

Arbeitet man mit zwei Fenstern gleichzeitig, kann man mit [Strg][w][w] zwischen den beiden Fenstern springen. Beide Fenster kann man durch :qa bzw. :wqa ohne bzw. mit Speichern schließen.



VI und LESS

Wenn man sich mit VI auskennt, kann man auch das Linux-Anzeige Programm less deutlich besser nutzen. Die Funktionen zum Suchen und Positionieren innerhalb der Datei sind identisch.

Mehrnoch! Haben Sie gerade eine Datei mit less zum Anschauen geöffnet und sehen, dass Sie diese editieren möchten, reicht die Eingabe von "v" um die Datei mit dem Editor zu öffnen.
Hier kann Ihnen Ubuntu einen kleinen Streich spielen. Standardmäßig ist in Ubuntu Nano als Editor definiert und wenn man mit VI bzw. Vim fitt ist, empfindet man dies eher als störend. Um Abhilfe zu schaffen, rufen Sie sudo update-alternatives --config editor auf:

user@pc:~$ sudo update-alternatives --config editor

Es gibt 6 Alternativen, die »editor« bereitstellen.

Auswahl Alternative
-----------------------------------------------
1 /bin/ed
+ 2 /bin/nano
3 /usr/bin/mcedit-debian
4 /usr/bin/vim
5 /usr/bin/vim.basic
6 /usr/bin/vim.tiny

Drücken Sie die Eingabetaste, um die Vorgabe[*] beizubehalten,
oder geben Sie die Auswahlnummer ein: 4
Verwende »/usr/bin/vim«, um »editor« bereitzustellen.
user@pc:~$

Falls das nicht funktioniert, können Sie den Link auch manuell ändern: Wechseln Sie dazu als Root nach /etc/alternatives und löschen Sie dort die Links "editor" und "editor.1.gz". Anschließend legen Sie dort neue Links auf Vim an:

ln /usr/bin/vim editor
ln /usr/share/man/man1/vim.1.gz editor.1.gz