Startseite ]  [ Netz-Schule ]  [ Linux-Schule ]  [ Map ]

  Know How
  Glossar

   
  Linux-Schule Know How  

VI - God's own Editor

VI ist unkomfortabel, kommt ohne bunte Icons daher, hat sogar die Frechheit ohne X Oberfläche existieren zu wollen und VI ist bestimmt einer der am schwierigsten zu erlernenden Editoren überhaupt. Eigentlich ist VI schon gar kein Editor mehr, sondern ein komplettes System, das vom Editieren von Texten bis hin zum kompletten Mailclient, gar zur Benutzeroberfläche, fast alles kann. Wenn man weiß wie. Deswegen erfolgt hier eine, lange versprochene und überfällige Einführung zum VI iMproved, dem Editor, der auf 99 % aller Distributionen dabei ist.

Um diesen Editor zu benutzen, sollte man den festen Willen haben, Linux professionell zu nutzen oder zu programmieren. Wer dies nicht will, sollte sich "nedit" installieren. Ein guter X Editor. vim ist definitiv die beste Wahl, erfordert aber Einarbeitung

Vielleicht etwas abschreckend - aber Tatsache. Es gibt auch eine X Variante von vim, die aber 'nur' Menues mitbringt, keine Icons. Vielleicht ein guter Mittelweg ?!

Grundlage des VIM ist der seit 1984 im Einsatz befindliche VI. Obwohl das nun schon gute 16 Jahre her ist, entwickeln die meisten mir bekannten Programmierer immer noch mit Ihm - und das aus gutem Grunde. Vermutlich werden die meisten Windowsum- oder Linuxeinsteiger dem VI nicht viel abgewinnen, zu umständlich mutet die Bedienung an. Keine Maus, nur das Keyboard wird benutzt - komplizierte Kommandos sind zu benutzen... alles das was heutzutage als Todsünde betrachtet wird. Doch genau das macht aus dem vim die erste Wahl zur Programmentwicklung. Die erste Hürde, an der viele User gefrustet umkehren, sind die Betriebsmodi des vim.

  1. Operativmodus - beschreibt den Ausgangszustand nach Programmstart, hier lassen sich alle Tastenbefehle und die dazugehörigen Kombinationen benutzen.
  2. Einfügemodus - in diesem werden alle Tastatureingaben als Texteingaben interpretiert und in die zu editierende Datei geschrieben.
  3. Kommandozeilenmodus - hier werden die komplexeren Befehle zum Editieren benutzt, Dateibefehle eingesetzt und die Konfiguration des Editors festgelegt.Hier ist vor dem Befehl ein : einzugeben.
  4. Suchmodus - dieser erlaubt den Einsatz komplexer Suchmuster und Algorythmen. Beginnt für gewöhnlich mit einem /

Das klingt auf den ersten Blick vielleicht etwas kompliziert, macht aber beim Arbeiten dann doch Sinn. Die strikte Trennung der Modi ist hier einfach notwendig, weil es keine Menüs gibt. Alle Eingaben erfolgen daher im Programmfenster. Verlaufen ? Kein Problem - einige Male auf die ESC Taste gedrückt und Ihr befindet Euch wieder im Operativmodus. Das wird Euch am Anfang oft, hinterher weniger oft passieren. Vielleicht irgendwann gar nicht mehr.

Beginnen wir vorne : Der Programmstart des vim :

Programmstart
Kommandozeilenaufruf   FunktionBeispiel
vimAufruf von vim mit leerem Textfeldvi
vim Dateiname(n)Aufruf von vim mit angegebener Datei, der Cursor wird am Dateianfang plaziertvi welcome.ger
vim + Dateiname(n)Aufruf von vim mit angegebener Datei, der Cursor wird am Dateiende plaziertvi + welcome.ger
vim +n Datei(en)Aufruf von vim mit angegebener Datei, der Cursor wird in Zeile n plaziertvi +212 welcome.ger
vim +/muster Datei(en)Aufruf von vim mit angegebener Datei, der Cursor wird auf dem "muster" plaziertvi +/Neues welcome.ger



All das hat durchaus seinen Sinn. Der letzte Aufruf zum Beispiel ist immer dann nützlich, wenn ich auf der Startseite nur etwas unter "Neues" eintragen will. Ich lande genau da, gebe die neue Seite ein und beende. Ohne scrollen, suchen und andere lästige Dinge.

Navigation

vim ist ein Multidateieneditor. Das macht sich bei der Entwicklung von Internetprojekten besonders positiv bemerkbar. Man ruft einfach die 3 wichtigsten Dateien auf und kann problemlos zwischen Ihnen wecheln. Dazu gibt es im wesentlichen 3 Möglichkeiten : kurzer Einschub - [ESC]Befehlskürzel bedeutet : 1 x ESC, 1 x Doppelpunkt, Befehl sofern Ihr nicht ohnehin im Kommandomodus seid. Wenn Ihr also mitten im Editieren seid und zur nächsten schließenden Klammer wollt dann müßt Ihr ESC% eingeben.

  1. [ESC]:n - sringt zur nächsten Datei in der Schlange
  2. [ESC]:n# - wechselt zwischen der aktuellen und der zuletzt geladenen Datei
  3. [ESC]:n Dateiname - springt direkt zur angegebenen Datei

Bewegen kann man sich im Text mit den Cursortasten oder , falls man sich auf dem Laptop nicht die Finger brechen will, mit :

  • [ESC] h - nach links
  • [ESC] j - nach unten
  • [ESC] k - nach oben
  • [ESC] l - nach rechts
  • [ESC] w - ein Wort weiter
  • [ESC] b - ein Wort weiter
  • [ESC] e - an das Ende eines Wortes
  • [ESC] $ - an das Zeilenende
  • [ESC] 0 - an den Zeilenanfang
  • [ESC] % - zur nächsten schließenden Klammer
  • [ESC] G - an das Ende der Datei
  • [ESC] 1G - an den Anfang der Datei ... uuuund
  • [ESC] 100G - an den Anfang der Zeile 100 der Datei

Das war es ;) Mehr fällt mir im Moment nicht ein, mehr habe ich also auch nie gebraucht. Natürlich lassen sich auch die Befehle h,j,k,l,w und b mit beliebigen Zahlen kombinieren ! So. Bewegen kann man sich, Dateien aufmachen auch, von einer Datei zur anderen springen klappt auch schon... wann zum Geier wird also endlich was geschrieben ? Jetzt ;)

Texteingabe

Zur Texteingabe werden im vim, wie in jedem anderen Editor auch, die Tasten auf dem Keyboard verwendet. Wenn Ihr dort ein "h" antippt, bestehen gute Chancen das eben dieses h auch auf dem Monitor auftaucht. Mehr gibt es eigentlich nicht zu sagen ;) Oder doch... stimmt .... das Ding mit den Modi. Wie bereits gesagt, hat vim verschiedene Betriebsmodi. Um einen Text einzugeben, müsst Ihr erst in den Einfügemodus. Diesen betretet Ihr mit :

  • i - Eingabe vor dem aktuellen Zeichen
  • a - Eingabe nach dem aktuellen Zeichen
  • o - Neue Zeile einfügen und Eingabe nach der aktuellen Zeile
  • I - Eingabe am Anfang der aktuellen Zeile
  • A - Eingabe am Ende der aktuellen Zeile
  • O - Neue Zeile einfügen und Eingabe vor der aktuellen Zeile
  • Strg+v - Eingabe eines Steuerzeichens

Jetzt könnt Ihr anfangen zu tippen, die kleinen Tasten.. remember ? Je nachdem wie gut Ihr seid, kommt es durchaus vor das Ihr Euch verschreibt. Von daher hat vim natürlich jede Menge Befehle zum löschen von Texten.

  • [ESC] x - entfernt das Zeichen unter dem Cursor
  • [ESC] X - entfernt das Zeichen vor dem Cursor
  • [ESC] dw - entfernt ab dem Cursor das aktuelle Wort
  • [ESC] d^ - entfert ab Cursor bis zum Zeilenanfang
  • [ESC] D - entfernt ab Cursor bis zum Ende der Zeile
  • [ESC] dd - entfernt die gesamte Zeile
  • [ESC] 10dd - entfernt die nächsten 10 Zeilen Text
  • [ESC] 4dw - entfernt die nächsten 4 Worte
  • [ESC] :1,d - entfernt ab Cursor bis zum Dateianfang
  • [ESC] :%d - entfernt allen Text aus der Datei

Die letzten beiden Befehle bedürfen einer Erklärung. vim besitzt sowas wie eine interne Adressierung für Textobjekte. Das Zeichen "^" steht dabei für den Zeilenanfang, "$" für das Ende einer Zeile bzw. Dateiende im Operativmodus (:). Die aktuelle Cursorposition wird, wie in Linux selbst, mit einem . bezeichnet. Der Text von aktueller Position bis zum Dateianfang ist also mit :

  • 1,.

adressierbar. d steht für löschen. So das sich das Beispiel wie oben ergibt :

  • 1,.d
  • von Zeile 1 (1) bis (,) zur aktuellen Position (.) löschen (d)

Wenn nichts anderes angegeben wird, bezieht sich jeder Befehl auf die aktuelle Position. Der Punkt ist also optional. So ergibt sich dann 1,d. Eine weitere Bedeutung des Punktes im Operativmodus ist die Befehlswiederholung. Hierfür ist der Punkt ohne weitere Zeichen einzugeben.

  • [ESC] . - wiederholt den letzten Befehl

Alle Änderungen können auf einfache Weise verworfen werden.

  • [ESC] u - macht die letzte Änderung rückgängig
  • [ESC] U - macht alle Änderungen der aktuellen Zeile rückgängig

Die Option U scheint nicht immer zu funktionieren ! Andererseits kann u offenbar viel mehr Änderungen rückgängig machen als nur die letzte. Im Original VI war es so, das man sobald die aktuelle Zeile verlassen wurde, nichts mehr verwerfen konnte. vim handhabt das ganze offenbar etwas moderater.

Seek and Destroy.. oder suchen und ersetzen

Wichtig für jeden Programmierer ist die Möglichkeit eingegebenen Text zu suchen, zu ersetzen und auf jede denkbare Weise zu ändern. Hier spielt vim seine ganze Kraft aus. Kaum ein Editor kann soviel mit nur 4 Tastenbefehlen. Wer sich über die kryptische Bedienung des vim beschwert, sollte bedenken : Er selbst macht im normalen Editor nichts anders ! Am Beispiel :htlm statt html getippt

  1. Im vim :
    • mit Cursor auf l
    • einmal ESC
    • x
    • p
  2. Normaler Editor :
    • mit Cursor auf l
    • ENTF
    • Cursor nach rechts
    • l

In beiden Fällen verwandelt sich das Wort, mit 4 Aktionen, in "html". Der Umstand existiert meistens nur im Kopf der User. Wörter mit der Maus markieren, im Dateimenü auf Kopieren zu gehen, die neue Stelle zu suchen, auf Einfügen zu gehen - all das sind Befehle. Vorteil der Maus : Intuitiv. Vorteil vim : Die Hände bleiben am Keyboard, ihr seid mit etwas Übung schneller.

Widmen wir uns den Fähigkeiten des vim auf diesem Gebiet. Das Entfernen von Vertippern habe ich ja eben kurz beschrieben. Die Befehlsabfolge :

  • [ESC],x,p bedeutet in Langform :
  • gehe in den Operativmodus (ESC), entferne das Zeichen unter dem Curso (x) und hänge es an das nächste Zeichen an (p).

In der Übersicht kurz die wichtigsten Befehle :

  • [ESC] r - entfernt das Zeichen unter dem Cursor und setzt das nächste von Euch geschriebene an dessen Stelle. Ihr könnt im Einfügemodus und im Operativmodus auch mit ENTF arbeiten.
  • [ESC] x p - vertauscht 2 Zeichen wie oben beschrieben.
  • [ESC] c w - ersetzt das Wort nach dem Cursor mit einem neuen
  • [ESC] d e e p - vertauscht 2 hintereinanderliegende Worte

d e löscht ein Wort, e springt an das Ende des folgenden Wortes, und p hängt das gelöschte Wort, das ich momentan im Zwischenspeicher befindet, einfach hinten an. Eine gute Gelegenheit den Zwischenspeicher kurz zu erwähnen. Um eine Zeile aus dem Text zu löschen und langfristig in den Zwischenspeicher zu legen, benutzt man folgendes Kommando :

  • [ESC] " a d d
um den Inhalt irgendwo wieder einzufügen :
  • [ESC] " a p

vim stellt Euch 26 derartige Textbuffer zur Verfügung. Diese werden mit den Kleinbuchstaben von a - z angesprochen. Ein bunter Strauss voll Textablage. Windowsuser, afaik, sollen ja noch mit einem Text auskommen müssen... nunja :). Die Ablage existiert nur im Arbeitsspeicher - beendet Ihr vim, gehen die Texte verloren !

Wer suchet, der findet...

Eine weitere Stärke von vim ist das Suchen und Ersetzen von Text. Der Suchmodus wird generell durch das Kommando [ESC] / eingeleitet. Daraufhin erfolgt die Eingabe der zu suchenden Zeichenkette. Das Kommando n durchsucht den Text dann weiter nach der Zeichenkette. In 98 % aller Fälle sucht man etwas um es dann, durch etwas anderes, zu ersetzen. Das Ersetzen eines Strings durch einen anderen erfolgt dann wieder im Kommandozeilenmodus :

  • [ESC] : %s /img scr/img src/g - ersetzt "img scr" durch "img src". Das g steht für global und sorgt dafür das auch Mehrfachvorkommnisse in einer Zeile bearbeitet werden.

Das große Plus bei vim ist die Möglichkeit alle regulären Ausdrücke, die auch in Linux selbst vorkommen, verwenden zu können. Reguläre Ausdrücke sind z.B.

  • ^ - für Zeilenanfang
  • [0-9] - steht für alle Zahlen von 0 bis 9
  • [a-e] - steht für alle Kleinbuchstaben von a bis e
  • [a-e]* - bedeutet das a bis e beliebig oft vorkommen kann
  • ^[a-e] - bedeutet das a bis e nur am Zeilenanfang vorkommen darf

So lassen sich sehr komplexe Suchmuster zusammenbasteln. Wenn Ihr, zum Beispiel, HTML Code in einer HTML Seite anzeigen lassen wollt, muss < durch &lt; ersetzt werden. Anderenfalls wird der Code ausgeführt und nicht angezeigt. Kein Problem :

  • [ESC]  %s /</&lt;/g

Hier noch die fehlenden Übersichten zum Suchen und Ersetzen. Alle Befehle lassen sich natürlich auch hier mit einer Mengenangabe versehen, die dann wieder vor dem eigentlichen Befehl kommt. ([ESC] 3x z.B. löscht 3 Zeichen vom Cursor aus nach rechts) :

  • Texte ändern

  • [ESC] r - Ändert den aktuellen Buchstaben
  • [ESC] R - Überschreibemodus vom aktuellen Buchstaben aus
  • [ESC] c w - ersetzt das Wort vor dem Cursor durch die Eingabe
  • [ESC] c c - ersetzt die aktuelle oder nächste Zeile durch die Eingabe
  • [ESC] J - hängt die nächste Zeile an die aktuelle
  • Text löschen

  • [ESC] x - löscht unter dem Cursor und nach rechts
  • [ESC] X - löscht unter dem Cursor und nach links
  • [ESC] D - löscht vom Cursor bis zum Zeilenende
  • [ESC] d d - löscht aktuelle Zeile

Auch hier wieder Mengenangaben : [ESC] 10y , kopiert die nächsten 10 Zeichen

  • Texte in der Zwischenablage

  • [ESC] 1...0 oder a...z - Zwischenablage für die nächste Aktion wählen
  • [ESC] y - aktuelles Zeichen in Zwischenablage legen
  • [ESC] y y - aktuelle Zeile wird in Zwischenablage gelegt
  • [ESC] p - Inhalt der aktuellen Zwischenablage hinter Cursor einfügen
  • [ESC] P - Inhalt der aktuellen Zwischenablage vor Cursor einfügen
  • Suchen und Ersetzen von Text

  • [ESC] /Text - sucht nach der Zeichenkette "Text"
  • [ESC] ?Text - sucht rückwärts nach der Zeichenkette
  • [ESC] n - wiederholt das letzte Suchkommando
  • [ESC] N - wiederholt das letzte Suchkommando in die andere Richtung
  • [ESC] f[Zeichen] - sucht in der aktuellen Zeile vorwärts nach Zeichen
  • [ESC] F[Zeichen] - sucht in der aktuellen Zeile rückwärts nach Zeichen
  • [ESC] : /Alt/Neu/ - ersetzt Alt durch Neu im Text, einmal pro Zeile
  • [ESC] : /Alt/Neu/g - ersetzt Alt durch Neu im Text, überall
  • [ESC] -

Das erstmal dazu. Die Befehlsübersicht ist definitiv nicht komplett. Einmal ist das auch kaum zumachen, zum zweiten gibt es ein ganz tolles Manual und drittens verkauft Lehmanns Onlinebuchhandlung diese VI Tasten mit einer Befehlsreferenz drauf. Die Teile haben den Vorteil das man auch Kaffee draus trinken kann. Ich find die praktisch und habe 3 Stück.

Zusammenarbeit und Textübernahme

Eine der Stärken von Linux und allen gut programmierten Applikationen ist Ihr Zusammenspiel untereinander. So ermöglicht es vim natürlich jegliche Art der Ausgabe eines anderen Programmes direkt in einen Text zu schreiben :

  • [ESC] :r!ls -laF - übernimmt die Ausgabe des ls Befehles in den Text

und bedeutet übersetzt soviel wie

  • gehe in den Kommandomodus und führe den Befehl ls (:r!ls...) aus. Die Ausgabe wird dann in die Datei umgeleitet.

Setup, Makros und Konfigurationszauber

Makros sind etwas wunderbares. Wer beispielsweise viele HTML Seiten mit Hand erstellt, tippelt immer wieder die gleichen Tags. Sei es html, body, head, input type... was auch immer. Dafür bietet es sich doch an die Funktionstasten mit eben diesen Texten zu belegen. Mit vim ist das recht einfach :

  • [ESC] #1 i<html><cr><head><cr><title></title> <cr></head><cr><body><cr></body><cr></html>

legt zum Beispiel die obige Sequenz auf die Taste F1. Wenn man diese jetzt mit [ESC]<F1> aufruft, erhält man dieses :

<html>
<head>
<title></title>
</head>

<body>
</body>
</html>

Das Grundgerüst einer HTML Datei also. Fertig zum Einsatz. Gleichermaßen kann man mit Meta Tags verfahren oder allen, ständig wiederkehrenden, Texten. Als Makro kann alles eingegeben werden. Wer jetzt den VI beendet wird das Makro allerdings vergeblich suchen. Vim verliert die Einstellungen beim beenden. Damit kommen wir zum Setup und der Datei ".exrc", die man in seinem Homeverzeichnis anlegt. Inhalt könnte sein :

  • set ic - für ignore case, ignoriere Gross- und Kleinschreibung beim suchen
  • set nu - für number, schaltet die Zeilenanzeige unten rechts ein
  • set wm=3 - setzt die Worttrennung 3 Spalten vom rechten Rand
  • set tabstop - stellt den Tabulator auf 4 Spalten ein
  • map #1 i<html><cr><head><cr><title></title> <cr></head><cr><body><cr></body><cr></html> - speichert ein Makro

Und so weiter. Eine komplette Liste der Einstellungen im vim bekommt man mit dem Befehl [ESC] : set all. Weitergehende Hilfe für die einzelnen dort gelisteten Befehle mit [ESC] : help Einstellung. Das soll es, erst einmal, gewesen sein. Im Laufe der Zeit folgen noch "Syntaxhighligthing" und eine kurze Liste der wichtigsten Einstellungen in deutsch. Bis dahin, viel Spaß beim vimmen.