vi
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Änderung) (keine anderen Diffs, Normalansicht)

Hinzugefügt: 329a330
* Wikibook " http://en.wikibooks.org/wiki/Learning_the_vi_editor"

"visual editor". Unter Unix allgegenwärtig (entweder als Original oder als einer der Clones wie nvi oder vim).

"vi has two modes: the one in which it beeps, and the one in which it doesn't." -- Alan Cox, Linux kernel developer

Entwickelt von Bill Joy an der Berkeley Universität (ab ca. 1976), war vi nicht frei sondern nur im Rahmen der "Unix Source Code License" verfügbar. Dies hat zur Entwicklung zahlreicher Clones geführt. Im Jänner 2002 hat Caldera den Sourcecode unter einer "BSD-artigen" Lizenz freigegeben [1]. Das OpenSource-Projekt ex/vi befindet sich nun auf BerliOS: http://developer.berlios.de/projects/ex-vi/ .


Inhaltsverzeichnis dieser Seite
Für Windows-Umsteiger   
Kurzeinführung   
Kurzes Beispiel   
Konfigurationsfile   
Konfigurationsfiles erfahrener vi-Benutzer   
Was tun bei Fehleingaben?   
Die nötigsten Befehle   
Besondere Themen   
Regular Expressions   
Mehrere Files editieren   
ctags (Navigation in Softwareprojekten)   
Wechselspiel mit der Shell   
Besondere Bewegungen   
Highlights   
Tips   
Links   
Tutorials   
Bücher   
Referenzmaterial   
Diverses   

Für Windows-Umsteiger    

Kurzeinführung    

Der vi ist für jemand, der aus der Windows-Welt kommt, sehr gewöhnungsbedürftig. Andererseits ist es oft der einzige "mächtige" Editor, den man auf typischen Webspaces mit Telnet-Verbindung zur Verfügung hat.

Wichtig ist die Philosophie zu verstehen, die dem vi bzw. einem Großteil der "alten" Unix-Kultur zu Grunde liegt: Auf langsame Terminalverbindungen hin optimiert alles wortkarg (mit möglichst geringem IO) zu erledigen.

Vermutlich ist der vi jener Editor, mit dem man die typischen Programmieraufgaben mit den wenigsten Tastendrucken erledigen kann. Wer nur einen Konfigurationsfile ändern will, der ist mit pico (oder dem Clone nano) besser bedient. Der hat zwar nur ein Dutzend Befehle, aber die werden am Bildschirm angezeigt - man muss nichts lernen. Wer andererseits richtig Softwareentwicklung betreiben möchte, greift vermutlich früher oder später zu emacs (xemacs). Der ist eine in Lisp (elisp) programmierbare eierlegende Wollmilchsau. Der vi liegt also beim Einleben in die Unix-Welt irgendwo in der Mitte.

Wobei für grafische Oberflächen der »gvim« nicht unerwähnt sein sollte. Ab Version 6.0 (6.4 ist aktuell) kann der sein Fenster nicht nur horizontal, sondern auch vertikal (mehrfach) teilen, und hat einen File-Explorer, HTML- und HEX-Konversion. Aus meiner Sicht (hs) ist der gvim eine in Vim(etc.) programmierbare, eierlegende Wollmilchsau.

Kurzes Beispiel    

Ein vorhandener File test.txt soll editiert, am Fileende der Text "xyz" angefügt werden:

vi test.txt<enter>
G (Bewegung ans Ende des Files, Editor ist im command-Mode, Tastendruck bleibt unsichtbar)
Axyz<esc> (A=Append am Ende der Zeile, "xyz" im insert-Mode)
:wq<enter> (":" startet den ex-Mode mit editierbarer Eingabezeile am unteren Bildschirmrand, w=write, q=quit)

Ungewohnt ist, dass der vi nicht in einem Eingabemodus startet, wie fast jeder andere Editor. Der Benutzer muss erst ein Kommando zum Wechsel in einen Eingabemodus geben, bevor er Text eintippen kann.

Der Benutzer sollte quasi ein Register im Gehirn entwickeln, das ständig den aktuellen Mode enthält und den Modus-Wechsel immer mitdenkt. Z. B. wechselt man mit "A" (bzw. mit vielen anderen Befehlen) in den insert-Mode, mit <esc> zurück in den command-Mode. Mit ":" vom command-Mode in den ex-Mode und mit <enter> oder <esc> vom ex-Mode zurück in den command-Mode.

Anmerkungen:

Der ex-Mode hat seinen Namen vom Vorgänger-Zeileneditor ex, dessen Befehle auf diese Weise in den vi integriert wurden.

Das Kommando "A" wurde oben nur aus optischen Gründen verwendet, damit er sich besser von der Eingabe "xyz" abhebt. "A" bedeutet "Einfügen nach dem Zeilenende", wir sind im Beispiel aber ohnehin schon am Dateiende. Das naheliegendere und häufigere Kommando wäre "a" = "Einfügen nach der Cursor-Position (append)" oder "i" = "Einfügen an der Cursorposition (insert)".

Auch der ex-Befehl ":wq" ist nicht unbedingt die Methode der Wahl. Er dient im Beispiel dazu, den ex-Mode ins Spiel zu bringen. Häufiger sind die Kommandos "ZZ" und ":x", die ebenfalls allfällige Änderungen speichern und den vi beenden. Weils so essentiell ist: ":q" beendet ohne speichern, ":q!" beendet ohne speichern trotz Änderungen.

Konfigurationsfile    

Der Konfigurationsfile trägt den Namen ".exrc", enthält Optionen und befindet sich im $HOME-Verzeichnis des Benutzers. Meist existiert der File nicht und muss erst angelegt werden.

Die Anzeige der eingestellten Optionen innerhalb des vi erfolgt mit dem ex-Befehl ":set all".

Im vi können Optionen temporär gesetzt werden: Z. B. ":set autoindent"
im Konfigurationsfile wird die gleiche Option als "set autoindent" eingegeben.

Für den Einsteiger interessante Optionen:

OptionBeschreibung
autoindentAutomatische Einrückung
showmodeAnzeige des Mode
rulerAnzeige der aktuellen Zeile / Spalte
numberAnzeige der Zeilennummern vor jeder Zeile
nowrapscan(Geschmackssache) kein zyklisches Weitersuchen am Fileende

Konfigurationsfiles erfahrener vi-Benutzer    

Um Spenden wird gebeten!

Files:

Achtung: Die Sonderzeichen in den Konfigurationsfiles können nicht aus den HTML-Vorlagen kopiert und verwendet werden. Sie können auch nicht im pico/nano eingegeben werden! Sie werden am besten im vi selbst, durch Kombinationen beginnend mit <Ctrl>+v erzeugt:

<Ctrl>+v <Enter> ..... Um beispielsweise ^M (CR) als Inhaltszeichen einzugeben.
<Ctrl>+v <Esc> ..... Um ^[ (ESC) als Inhaltszeichen einzugeben.

Man sollte damit rechnen, daß ein Native-vi in der .exrc weder Kommentarzeichen ("), Leerzeilen noch unbekannte Parameter akzeptiert und entweder komplett oder ab der jeweiligen Stelle die Anweisungen in der .exrc dann ignoriert.

Was tun bei Fehleingaben?    

Nervtötend sind beim Einsteigen jene Fehleingaben, die entstehen, wenn man im insert-Mode irgendwelche Funktionstasten betätigt (Reflexe von anderen Editoren). Ein <del> oder <ctrl><pgup> kann alles Mögliche bewirken. In welchem Mode ist man nun (Option showmode hilft)? Wie wird man die Fehleingaben wieder los?

Nützliche Befehle

BefehlBeschreibung
<esc>Sicherstellen des command-Mode
uundo der letzten Operation
<ctrl>+Rredo der letzten undo-Operation
UWiederherstellen der aktuellen Zeile
ddLöschen der aktuellen Zeile
DLöschen bis zum Zeilenende
xZeichen unter dem Cursor löschen
#xDie Anzahl # Zeichen ab Cursorposition löschen
:q!(Not-)Verlassen ohne Dateiänderung
:e!Änderungen verwerfen und Datei neu laden

Die nötigsten Befehle    

vi-spezifische Eingabebefehle:

Funktionvi-Kommando
Einfügen vor der aktuellen Cursorpositioni
Einfügen nach der aktuellen Cursorpositiona
Einfügen am Ende der ZeileA
Einfügen am ZeilenanfangI
Einfügen in einer neuen Zeile oberhalb der aktuellen ZeileO
Einfügen in einer neuen Zeile unterhalb der aktuellen Zeileo

Bewegungen:

FunktionWindows-typischvi-Kommando
Zeile #<ctrl>g [Eingabedialog]#G
Fileanfang<ctrl><home>1G oder gg
Fileende<ctrl><end>G
Zeilenanfang<home>0
Zeilenende<end>$
Erstes nicht-whitespace-Zeichennicht verfügbar^
Einen Bildschirm vorwärts rollen<page-down><ctrl>F
Einen Bildschirm zurück rollen<page-up><ctrl>B

Löschen:

FunktionWindows-typischvi-Kommando
Letztes Eingabezeichen löschen<backspace><esc>xi
Zeichen unter dem Cursor löschen<del>x bzw. <esc>x
Zeile löschen<ctrl>Ydd

Cut, Copy und Paste:

FunktionWindows-typischvi-Kommando
markieren<shift><cursor-move>mv ... mb
Markiertes ausschneiden<ctrl>x:'v,'bm32
Markiertes kopieren<ctrl>c:'v,'by oder :'v,'bco42
Anfangsposition / AktuellePosition / Cut-ma und d'a (für Zeilen) oder d`a (für Zeichenpositionen)
Anfangsposition / AktuellePosition / Copy-ma und y'a (für Zeilen) oder d`a (für Zeichenpositionen)
Cut Wort (bis vor Zeichen "X")-dw (dtX)
Copy Wort (bis Zeilenende)-yw (yt$)
3 Zeilen ausschneidennicht verfügbar3dd
3 Zeilen kopierennicht verfügbar3yy
Buffer vor der aktuellen Position einfügen<ctrl>pP (wenn Zeilen gebuffert sind wird vor der aktuellen Zeile eingefügt - sonst vor der aktuellen Cursorposition)
Buffer nach der aktuellen Position einfügen p (wenn Zeilen gebuffert sind wird nach der aktuellen Zeile eingefügt - sonst nach der aktuellen Cursorposition)
(Komplexe) Schreibaktion (mehrfach) wiederholen . (n.nnn.n.n. ...!)

Suchen und ersetzen:

FunktionWindows-typischvi-Kommando
Normale Textsuche<ctrl>f[Eingabedialog]/text<enter>
Suche WiederholenF3n
(Suche zurückspringen)nicht verfügbarN
(rückwärtssuchen)nicht direkt verfügbar?text<enter>
Ersetzen<ctrl>f[Eingabedialog]:s/alt/neu/
Ersetzen einmalw.o.:s/alt/neu/ (nur in der aktuellen Zeile)
Ersetzen mehrfachw.o.:s/alt/neu/g (mehrfach, nur in der aktuellen Zeile)
:s/alt/neu/gc (wie oben, nur mit bestätigen jeder Ersetzung; c=confirm)
Ersetzen in einem Zeilenbereichw.o. (falls verfügbar):3,10s/alt/neu/g
Ersetzen im ganzen Filew.o.:%s/alt/neu/g oder
:1,$s/alt/neu/g oder
:g/alt/s//neu/g
Ersetzen wiederholenF3& (nur einfach, in der aktuellen Zeile)
Suchen nach Wort unter dem Cursor-* (extrem praktisch) entspricht einer Suche "/\<wort\>"
...  

Anzumerken ist, dass sowohl die Commandozeile (":") als auch die Suchfunktion ("/" oder "?") einen History-Speicher haben, so dass man einfach auf kürzlich verwendete Befehle zurückgreifen kann.

Umfassende Sammlung:

Besondere Themen    

Regular Expressions    

Die vi regular Expressions sind, wenn man von Perl kommt ziemlich leicht zu verstehen, aber nicht so ausgefeilt. Leider unterscheiden sich die verschiedenen vi-Versionen sehr in ihren Fähigkeiten (manche sind auch ausgesprochen buggy).

Unterschiede zu Perl:

BeschreibungviPerl
Gruppierung\( \)( )
gefundene Textteile\1 .. \9$1 .. $9
Wortgrenzen\<Einwort\>\bEinwort\b
...  

Häufige Merkmale (Gemeinsamkeiten):

Beschreibungvi und Perl
Zeilenanfang^
Zeilenende$
Zeichen aus einer Gruppe[abc] bzw. [^a-z]
Irgendein Zeichen. [1]
Vorangehendes Zeichen 0-n fach*
Vorangehendes Zeichen 1-n fach+
Vorangehendes Zeichen 0-1 fach?
... 

[1] - Der Punkt '.' hat in Perl einen kleinen Haken, denn u.U. steht er für alles außer \n (also [^\n]). Um '.' wirklich "jedes" Zeichen matchen zu lassen, muss der Regexp-Modifier /s angebracht werden:

$_ = "Ein Text\nüber zwei Zeilen";

/(.+)/  and print "OHNE /s: $1\n";
/(.+)/s and print "MIT /s : $1\n";

Mehrere Files editieren    

Zunächst kann man im vi jederzeit mit dem ex-Befehl

:e filename
zu einem anderen File wechseln. Wenn es Änderungen gegeben hat, dann müssen diese allerdings vorher gespeichert werden. Mit dem Befehl
:e#
kommt man zum vorigen File (und der Position wo man war) zurück.


Möchte man eine vi Session mit aufgeteilten Fenstern starten verwendet man den Optionsschalter "-o" bei horizontaler Aufteilung und "-O" bei vertikaler Aufteilung:

$ vi -o fileone filetwo

oder

$ vi -O fileine filetwo


Zwischen Fenstern wechseln kann man mit CTRL-W + <right> (oder einer der anderen Cursortasten).

Ein neues Fenster mit einem zusätzliche File öffnen:


Wenn man mehrere Dateien editieren möchte, dann kann man mehrere Dateien beim Starten angeben:

vi test.txt script.pl
vi *.c

und zwischen diesen Files mit den Befehlen

:n (zum nächsten File weitergehen)
:rew (zum ersten File zurückspringen)
:args (Anzeige der Dateien und der aktuellen Position)

navigieren. Mit dem Befehl

:n *.txt (Beispiel)

kann man eine neue Liste von Files aktivieren.


Die dritte Methode funktioniert mittels ctags (siehe nächster Abschnitt).

ctags (Navigation in Softwareprojekten)    

Mit dem separaten Programm ctags kann man ganze Softwareprojekte indizieren. Dabei wird ein File tags (Default-Name) angelegt und je gefundenem Symbol (z. B. Funktionsname, Klasse, typedef etc.) eine Zeile eingetragen.

ctags files
ctags -R (rekursiv durch alle Unterverzeichnisse)

Speziell die GNU-Version "exuberant ctags" unterstützt eine große Anzahl von Programmiersprachen mit ihren speziellen Merkmalen.

Existiert der tags-File, dann kann man ohne sich um die Files zu kümmern direkt zu Symbolen navigieren:

vi -t symbol (öffnet den entsprechenden File an der richtigen Stelle)
:tnext (springt zum nächsten Vorkommen desselben Symbols)
:ta neuessymbol (springt zu einem anderen Symbol)
<ctrl>] (springe zum Symbol unter dem Cursor)

Ohne ctags wäre der vi für größere Softwareprojekte wahrscheinlich überhaupt nicht zu gebrauchen.

Anmerkung: ctags kann ebenso mit (x)emacs verwendet werden.


Links:


Wechselspiel mit der Shell    

ToDo.

Besondere Bewegungen    

ToDo.

Highlights    

ToDo.

Tips    

Nützliche Kleinigkeiten:

Zwei Buchstaben vertauschenxp
Zwei Zeilen vertauschenddp

Source Code reformatieren

gg=G

Links    

Tutorials    

Bücher    

Referenzmaterial    

Diverses    


KategorieUnixTool KategorieZitat


StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 25. Februar 2009 14:09 (diff))
Suchbegriff: gesucht wird
im Titel
im Text