Text-Editoren sind Werkzeuge, die ein komfortables Erstellen, Modifizieren und Betrachten von Text-Dateien (ASCII-Dateien) gestatten. Text-Dateien kommen relativ häufig vor. Hier einige Beispiele:
Konfigurationsdateien für Anwendungsprogramme und Server
E-Mails und News-Artikel
HTML-Seiten
Programm-Quelltexte (C/C++, Java, Shell, Python, Perl, Ruby, ...)
...
Es existiert eine Vielzahl unterschiedlichster Text-Editoren. Zwei der bekanntesten und bedeutendsten Editoren bzw. Editor-Familien für UNIX-Systeme sind der Vi und der Emacs, wobei der Emacs nicht nur als Editor, sondern auch als komplette Entwicklungsumgebung genutzt werden kann. Emacs- und Vi-Versionen stehen übrigens nicht nur für UNIX, sondern auch für alle anderen relevanten Systeme zur Verfügung.
Die ursprüngliche Version des Editors Vi wurde nach Informationen der VI LOVERS HOME PAGE 1976 von Bill Joy auf der Basis der zeilenorientierten Editoren ed und ex entwickelt. In der zur Distribution des frei verteilbaren Vi-Clones Nvi gehörenden Datei README findet sich folgende Aussage:
o From the original vi acknowledgements, by William Joy and Mark Horton: Bruce Englar encouraged the early development of this display editor. Peter Kessler helped bring sanity to version 2's command layout. Bill Joy wrote versions 1 and 2.0 through 2.7, and created the framework that users see in the present editor. Mark Horton added macros and other features and made the editor work on a large number of terminals and Unix systems.
Im Gegensatz zu seinen beiden Vorgängern arbeitet der Vi bildschirmorientiert, so wie man es heute von modernen Editoren erwartet. D.h., auf dem Bildschirm wird permanent der (weitgehend) aktuelle Zustand eines bestimmten, vom Nutzer wählbaren Ausschnitts des zu bearbeitenden Textes dargestellt. Hinreichend kleine Texte kann man natürlich komplett sehen. Genau ein Zeichen dieses Ausschnitts stellt die aktuelle Position im Text dar, die durch einen Cursor repräsentiert wird und vom Anwender beliebig verändert werden kann. Viele Editor-Kommandos beziehen sich auf diese aktuelle Position. So kann man dort u.a. Zeichen einfügen, löschen und gegen andere ersetzen.
Der Vi gilt als UNIX-Standard-Editor. Er ist integraler UNIX-Bestandteil. Sowohl kommerzielle als auch freie UNIX-Systeme verfügen über mindestens eine Vi-Version. Den Original-Vi findet man nur auf kommerziellen UNIX-Systemen, da dessen Code nicht frei ist, sondern dem Copyright von AT&T unterliegt. Unabhängig davon wurden mehrere Vi-Clones entwickelt, z.B. VIM, Elvis und Nvi, deren Quelltexte frei zur Verfügung stehen.
Der Vi ist ein relativ kleiner, aber dennoch sehr leistungsfähiger Editor. Anfänger empfinden ihn in der Regel als sehr gewöhnungsbedürftig, hauptsächlich wegen seiner Unterscheidung zwischen Kommando- und Einfüge-Modus.
VIM (Vi IMproved) und Elvis sind leistungsfähige Vi-Clones, die zum Original-Vi nahezu vollständig kompatibel sind, so dass sie diesen problemlos ersetzen können. Selbst erfahrene Vi-Nutzer finden daher beim Umstieg auf die neuen Werkzeuge eine vertraute Umgebung vor. Bei den meisten neueren Linux-Distributionen verbirgt sich standardmäßig hinter dem Kommando vi der VIM. Früher dominierte der Elvis.
Beide Editoren stehen für eine ganze Reihe von Systemen/Plattformen zur Verfügung (UNIX, Windows, OS/2, DOS, Atari sowie bei VIM noch einige weitere), so dass man beim Systemwechsel nicht zwangsläufig umlernen muss, sondern überall die gewohnte Editor-Umgebung antrifft.
Die zum Zeitpunkt der letzten Modifikation dieses Dokuments aktuellen Voll-Versionen sind:
VIM 7.4
Elvis 2.2
Hauptentwickler und "Vater" des Vim ist Bram Moolenaar, der von einer Reihe anderer Entwickler unterstützt wird. Elvis stammt von Steve Kirkendall. Der Vim wird aktiv gepflegt und weiterentwickelt, wogegen die Entwicklung des Elvis im Jahre 2003 beendet wurde.
VIM und Elvis weisen gegenüber dem Vi einen deutlich erweiterten Funktionsumfang auf. Dadurch wird dem Nutzer ein wesentlich einfacheres und komfortableres Arbeiten ermöglicht. Beide Editoren stellen ausgesprochen mächtige, flexible und effiziente Werkzeuge für die Erledigung unterschiedlicher Aufgaben (Lesen von Text-Dateien, Erstellung von LaTeX-Dokumenten und HTML-Seiten, System-Administration, Programmierung, ...) dar.
Die weiter unten folgenden Übersichten weisen auf ausgewählte, im Vergleich zum Original-Vi neue Merkmale von VIM und Elvis hin, wobei die offensichtliche VIM-Lastigkeit daher rührt, dass der Autor dieser Seite fast ausschließlich den VIM verwendet und diesen daher besser kennt. Verschiedene der genannten Eigenschaften des VIM sind in gleicher oder ähnlicher Form auch beim Elvis anzutreffen.
Der Aufruf von VIM und Elvis erfolgt wie beim Vi durch eine Kommandozeile folgender Struktur:
vim [Optionen] [Datei ..]
elvis [Optionen] [Datei ..]
Detail-Fragen lassen sich bei beiden Editoren am besten mit Hilfe der sehr umfangreichen (englischsprachigen) Online-Hilfe klären, die über das Kommando
:help
erreicht werden kann.
Speziell für Nutzer, die erstmals mit einem Vi-ähnlichen Editor arbeiten, sei als möglicher Startpunkt auf die folgenden Dokumente verwiesen:
Nimm vim! - Vortrag auf dem 224. UNIX-Stammtisch in Sachsen am 28.2.2017
VIM-Tutor: Kommando vimtutor auf einem System mit installiertem Vim
Eine Sammlung vieler nützlicher Informationen, Tipps und Links zum Vi, VIM und Elvis sind bei Wikipedia zu finden:
http://de.wikipedia.org/wiki/Vi
http://en.wikipedia.org/wiki/Vi
http://de.wikipedia.org/wiki/Vim
http://en.wikipedia.org/wiki/Elvis_(text_editor)
Zwei Hinweise auf Bücher zum Vim:
Reinhard Wobst vim 7.3 GE-PACKT vi improved Befehle, Hilfe, Skripte Autokommandos, Faltungen, Syntaxerkennung Plug-ins, Arbeiten über Netzwerk, Verschlüsseln Verlag: mitp 4. Aufl., 2012 391 Seiten ISBN 978-3-8266-8190-5 Steve Oualline Vi IMproved - Vim Verlag: New Riders 572 Seiten, Broschiert 1. Aufl., 2001 ISBN 0-7357-1001-5
Das englische Buch bezieht sich auf Vim 5.7 und kann online bezogen werden: http://www.truth.sk/vim/vimbook-OPL.pdf
Die VI LOVERS HOME PAGE [http://thomer.com/vi/vi.html] gibt einen Überblick über viele Vi-Derivate. Hier findet sich auch ein Verweis auf eine Übersicht über die neuen Möglichkeiten bei Elvis 2.x:
ftp://ftp.cs.pdx.edu/pub/elvis/README.html
Elvis kann über folgenden URL bezogen werden:
Nachfolgend noch eine Liste weiterer Links zu Vi- und Vim-Literatur:
Learning the vi Editor von Linda Lamb und Arnold Robbins: http://en.wikipedia.org/wiki/Learning_the_vi_and_Vim_Editors
Vim Cookbook von Steve Oualline: http://www.oualline.com/vim-cook.html
VIM Quick Reference Card: http://tnerual.eriogerg.free.fr/vim.html
Vim as XML Editor von Tobias Reif: http://www.pinkjuice.com/howto/vimxml
Vim Color Editor HOW-TO von Alavoor Vasudevan: http://www.linuxdocs.org/HOWTOs/Vim-HOWTO.htm
Unix Text Processing: http://www.oreilly.com/openbook/utp
Nützliche Zusatz-Werkzeuge für Vi-Nutzer sind die folgenden beiden Programme:
Exuberant Ctags von Darren Hiebert, eine sehr leistungsfähige Ctags-Version für mehr als 30 Programmiersprachen:
http://ctags.sourceforge.net
xxd, ein Konverter von Jürgen Weigert, der beliebige Binärdateien in einen Hex-Dump oder umgekehrt den Hex-Dump in die zugehörige Binärdatei transformiert
Beide Programme werden meist zusammen mit dem Vim verteilt und installiert.
VIM 5.0 aus dem Jahre 1998 zeichnet sich gegenüber der zuvor aktuellen Version VIM 4.6 durch viele Erweiterungen aus. Die folgende Liste gibt einen Überblick über die wichtigsten Neuerungen bei VIM 5.x (für Details s. Kommando :help version5):
VIM 5.x verfügt über ein durch Konfigurationsdateien anpassbares, flexibles Syntax Highlighting für eine sehr große Anzahl von Sprachen/Formaten (C, C++, Java, TeX, HTML, Shell, Maple, ...).
Das durch das Kommando :syntax on aktivierte Syntax Highlighting bietet die Möglichkeit, verschiedene Teile eines Textes durch unterschiedliche Farben oder Fonts darzustellen und so hervorzuheben bzw. leichter unterscheidbar zu machen. Derartige Textteile können z.B. Schlüsselwörter einer Programmiersprache oder Zeichenfolgen, die einem bestimmten Muster entsprechen, sein. Syntax Highlighting kann beispielsweise einem Programmierer helfen, bestimmte lexikalische oder syntaktische Fehler in einem Quelltext einfacher und schneller zu erkennen.
Es steht eine eingebaute Skript-Sprache zur Verfügung, mit deren Hilfe die Arbeitsweise des Editors gesteuert werden kann. Sie verfügt u.a. über Schleifen und Alternativen und gestattet die Manipulation interner Register und Optionen.
Beispiele (ohne Kommentar):
:let i = 0 :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
:let &tags = expand("%:p:h") . "/tags"
:if version >= 500 : version-5-specific-commands :endif
Die bekannten Skript-Sprachen Perl, Python und Tcl sind als Konfigurationssprachen nutzbar.
Perl-Beispiele:
:perldo $_=reverse($_);1 :perl @l = ("L1", "L2", "L3") :perl $curbuf->Append(10, @l) # appends L1, L2 and L3 :perl $curbuf->Set(10, "Line") # replaces line 10 :perl $curbuf->Set(10, "Line1", "Line2") # replaces lines 10 and 11 :perl $curbuf->Set(10, @l) # replaces 3 lines
Tcl-Beispiele:
:tcl set bufs [::vim::buffer list] :tcl foreach b $bufs { $b append end "The End!" } :tcl set buf $::vim::current(buffer) :tcl $buf insert 1 "new first line" # Insert a line in buffer, as line {n}. :tcl $buf delete 2 4 # Delete several lines. :tcl $buf set 5 "line 5" # Replace a single line.
Python-Beispiel:
http://www.tu-chemnitz.de/~hot/PYTHON/EXAMPLES/VIM/upper.py
Für Windows und Macintosh existiert ab VIM 5.0 eine GUI-Version (GUI steht für Graphical User Interface). Das ist besonders für jene Nutzer sehr angenehm, die auch auf diesen Systemen nicht auf ihren geliebten Vi/VIM verzichten möchten :-)
VIM 5.x zeichnet sich durch eine noch stärkere Vi-Kompatibilität aus. So ist z.B. im Gegensatz zu VIM 4.6 der von einigen Vi-Nutzern schmerzlich vermisste Ex-Modus implementiert: Kommando Q.
Die leistungsfähige Text-Formatierung, die bei VIM 4.6 über die Kommandos Q und gQ aktiviert werden konnte, steht jetzt nur noch unter dem Kommando gQ zur Verfügung. Durch geeignete map-Kommandos kann man allerdings weiterhin seine Texte mittels Q formatieren. Durch die Aufnahme der folgenden beiden Zeilen in eine Initialisierungsdatei des VIM (z.B. $HOME/.vimrc) lassen sich die Wirkungen von Q und gQ vertauschen:
noremap Q gq noremap gQ Q
Die regulären Ausdrücke wurden funktionell erweitert.
Es kann spezifiziert werden, wie oft ein Atom auftreten darf:
\{n,m} matches n to m of the preceding atom, as much as possible \{n} matches n of the preceding atom \{n,} matches at least n of the preceding atom, as much as possible \{,m} matches 0 to m of the preceding atom, as much as possible \{} matches 0 or more of the preceding atom, as much as possible (same as *)
Zusätzlich zum bekannten Longest Match (also dem Suchen der längsten passenden Zeichenfolge) kann man auch einen Shortest Match formulieren, bei dem die kürzesten passenden Zeichenfolgen gesucht werden:
\{-n,m} matches n to m of the preceding atom, as few as possible \{-n} matches n of the preceding atom \{-n,} matches at least n of the preceding atom, as few as possible \{-,m} matches 0 to m of the preceding atom, as few as possible \{-} matches 0 or more of the preceding atom, as few as possible
Die Liste der verfügbaren Atome wurde um mehrere Zeichenklassen-Spezifikatoren erweitert:
\s whitespace character: <Space> and <Tab> \S non-whitespace character; opposite of \s \d digit: [0-9] \D non-digit: [^0-9] \x hex digit: [0-9A-Fa-f] \X non-hex digit: [^0-9A-Fa-f] \o octal digit: [0-7] \O non-octal digit: [^0-7] \w word character: [0-9A-Za-z_] \W non-word character: [^0-9A-Za-z_] \h head of word character: [A-Za-z_] \H non-head of word character: [^A-Za-z_] \a alphabetic character: [A-Za-z] \A non-alphabetic character: [^A-Za-z] \l lowercase character: [a-z] \L non-lowercase character: [^a-z] \u uppercase character: [A-Z] \U non-uppercase character [^A-Z]
Innerhalb eines durch [] spezifizierten Bereichs können jetzt ebenfalls Zeichenklassen-Spezifikatoren angegeben werden:
[:alnum:] letters and digits [:alpha:] letters [:ascii:] ASCII characters [:blank:] space and tab characters [:cntrl:] control characters [:digit:] decimal digits [:graph:] printable characters excluding space [:lower:] lowercase letters [:print:] printable characters including space [:punct:] punctuation characters [:space:] whitespace characters [:upper:] uppercase letters [:xdigit:] hexadecimal digits
Die Standard-Eingabe ist als Datenquelle nutzbar:
find . -name "*.c" -print | vim -
VIM 5.x kann mit überladenen Tags umgehen. Der Nutzer hat die Möglichkeit, mehrere Tags über denselben Namen anzuspringen. Dies ist z.B. bei überladenen Funktionen in C++ nützlich.
:tselect List matching tags, and jump to one of them :stselect Idem, and split window g] Like CTRL-], but use ":tselect" instead of ":tag" After ":ta <tagname>" with multiple matches: :tnext Go to next matching tag :tprevious Go to previous matching tag :trewind Go to first matching tag :tlast Go to last matching tag
Es gibt eine ganze Reihe neuer Kommandos, Optionen und Kommandozeilenargumente.
Nachfolgend wird die vor VIM 5.x aktuelle Version 4.6 etwas näher vorgestellt. Diese Aussagen gelten weitgehend auch für die neue Version 5.x und zeigen interessante Erweiterungen gegenüber dem Vi.
nach dem Start erscheint ein typisches Vi-Bild; die Anwendung der gewohnten Vi-Kommandos sollte unmittelbar zum beabsichtigten Ergebnis führen
viele neue Optionen, z.B.:
:set ruler permanente Anzeige der aktuellen Zeile sowie der logischen und physischen Spalte :set expandtab automatische Expansion von in den Text eingefügten Tabulatoren, d.h. Ersetzung gegen entsprechend viele Leerzeichen
erweiterte Status-Anzeigen und Cursor-Positionierung
Ctrl-G zeigt u.a. die Nummer der aktiven Datei der Datei-Liste an, sofern diese aus mehr als einem Element besteht Zahl Ctrl-G teilt den kompletten Pfad der editierten Datei mit g Ctrl-G gibt die aktuelle Zeile, Spalte und Zeichenzahl an ga informiert detailliert über das Zeichen unter dem Cursor % Prozentangabe des Status ist auch für Cursor-Positionierung im Kommando-Modus nutzbar, z.B. 30%
flexibles Durchlaufen der Datei-Liste
:n
:N
:rew
:lastvorwärts
rückwärts
Anfang
Ende:files
:e #ZahlAnzeige der Datei-Liste
Auswahl einer Datei über ihre Nummer
Einfüge-Modus
Cursor-und Bild-Tasten normal verwendbar :set bs=2 Rückschritt-Taste (BackSpace) löscht beliebige Zeichen, auch zeilenüberschreitend Ctrl-P
Ctrl-N
Ctrl-X Ctrl-FErgänzung von Wörtern und Dateinamen an der Cursor-Position; besonders nützlich für lange und/oder kompliziert einzugebende Namen, z.B. password_expire_warning_days oder sKerberosOrLocalPasswd Ctrl-A fügt an der Cursor-Position denselben Text ein, der durch die zuletzt beendete Einfüge-Operation eingefügt worden war, wobei u.a. Cursor- und Bild-Tasten derartige Einfüge-Operationen beenden :set paste spezielle Option für Kopieren/Einfügen (Copy/Paste) per Maus unter X11
Visueller Modus
v zeichenweise Markierung V zeilenweise Markierung Ctrl-V Markierung rechteckiger Blöcke gv erneute Markierung des zuletzt markierten Bereichs
Markierte Bereiche sind vielfältig manipulierbar:
d
xlöschen c
rersetzen y in das unbenannte Register kopieren gq formatieren u Umwandlung von Groß- in Kleinbuchstaben U Umwandlung von Klein- in Großbuchstaben ~ Umwandlung von Klein- in Großbuchstaben und umgekehrt '< und '> spezielle Marken für die Bezugnahme auf den Anfang und das Ende des markierten Bereichs (auch in der Ex-Zeile nutzbar)
History
getrennte History sowie Editiermöglichkeiten für Suchmuster und Ex-Zeile
zusammen mit Undo besonders hilfreich bei komplexen Substitutionen (mühevoll erstellte reguläre Ausdrücke, ...)
unterstützt Trial and Error
Undo / Redo
mehrstufiges Undo und Redo als separate Funktionen
u Undo Ctrl-R
:redoRedo
für Vi-Kenner anfangs irritierend
Undo kann bis zum Originaldokument zurückgehen (kein [Modified] im Status mehr)
Achtung: Ex-Modus (Kommando Q) des Vi nicht implementiert
Q hat eine andere Bedeutung: leistungsfähige Formatierung von Textbereichen mit intelligenter Behandlung verschiedenartiger Kommentare.
Hinweis: Ab VIM 5.0 existiert der Ex-Modus. Er wird über das Kommando Q aktiviert.
Suchen
* Wort unter dem Cursor vorwärts suchen # Wort unter dem Cursor rückwärts suchen % zugehörige C-Präprozessor-Anweisungen suchen (anwendbar bei #if, #ifdef, #else, #elif, #endif) gd lokale Variablendefinitionen suchen gD globale Variablendefinitionen suchen
über die History-Liste ist das zuletzt verwendete und damit aktuelle Suchmuster ermittelbar
auf das Überschreiten des oberen bzw. unteren Text-Randes bei der zyklischen Suche wird hingewiesen:
search hit BOTTOM, continuing at TOP search hit TOP, continuing at BOTTOM
nicht gefundenes Muster wird explizit mitgeteilt, z.B.
Pattern not found: abc
Vervollständigung der Ex-Zeile
funktioniert für Kommandos, Optionen, Dateinamen und Tags
meist mit Tabulator-Taste realisierbar (Option wildchar)
Ctrl-D listet alle Namen auf, die zu dem vor dem Cursor stehenden Muster passen
Details unter :help cmdline_completion
Unterstützung mehrerer Puffer und Fenster
fensterbezogene Ctrl-W-Kommandos:
Ctrl-W w Wechsel zum nächsten Fenster Ctrl-W x aktuelles Fenster mit dessen Nachfolger auf dem Bildschirm vertauschen Ctrl-W + aktuelles Fenster vergrößern Ctrl-W - aktuelles Fenster verkleinern
fenster- bzw. pufferbezogene Ex-Kommandos:
:split horizontales Teilen des aktuellen Fensters :qall alle Fenster schließen und den Editor beenden, sofern kein Puffer modifiziert wurde :xall alle modifizierten Puffer ins Dateisystem schreiben und Editor beenden :wall alle modifizierten Puffer ins Dateisystem schreiben, ohne den Editor zu beenden :ball pro Puffer genau ein Fenster auf dem Bildschirm darstellen
Umgang mit langen Zeilen
Voranstellen von g vor entsprechendes Kommando zur Cursor-Bewegung (j, k bzw. Cursor-Taste) gestattet Übergang zur nächsten Bildschirmzeile (sonst nur zur nächsten Zeile des Textes)
seitliches Scrollen ist durch :set nowrap möglich und kann durch :set sidescroll gesteuert werden
maximale Zeilenlänge bei 32-Bit-Maschinen: 2147483647 (231-1) Zeichen
Zeilen dürfen aus beliebigen Zeichen bestehen; Binärdateien sollten mit gesetzter Option binary bearbeitet werden: vim -b oder :set binary
gf wechselt zur Datei, deren Name unter dem Cursor steht (z.B. Include-Datei oder Ziel eines HTML-Links)
Überschreiben existierenderDateien mit :w! auch für normale Nutzer möglich, nicht nur für Superuser
Swap- und Backup-Dateien
*.swp Swap-Datei für VIM-eigenen Recovery-Mechanismus; aktiviert durch vim -r *.bak Backup-Datei (Inhalt der editierten Datei vor dem letzten Zurückschreiben)
Tag-Suche
Ctrl-] Wort unter dem Cursor wird als Tag verwendet Ctrl-W Ctrl-] Tag-Suche mit Anzeige des Tags in einem anderen Fenster
Online-Hilfe in separatem Fenster, dabei Tag-Suche nutzbar
:help Online-Hilfe aktivieren :help Thema Online-Hilfe für ein bestimmtes Thema aktivieren, z.B. :help options
Aufzeichnen und späteres Wiederholen von Tastenfolgen
q Register Aufzeichnen einer Tastenfolge in einem Register @ Register Ausführen des Inhalts eines Registers
Veränderung von im Text enthaltenen Zahlen durch:
Addition Ctrl-A
Zahl Ctrl-ASubtraktion Ctrl-X
Zahl Ctrl-X
automatische Kommandoausführung mittels autocmd
Beispiel: automatisches Dekomprimieren von Dateien (*.gz und *.Z) beim Laden:
autocmd! BufReadPre,FileReadPre *.gz,*.Z set bin autocmd BufReadPost,FileReadPost *.gz,*.Z '[,']!gunzip autocmd BufReadPost,FileReadPost *.gz,*.Z set nobin
grafische Nutzeroberfläche: gvim
Unterstützung mehrerer Fenster
Online-Hilfe in HTML
X11-Interface (elvis -Gx11)
Verschiedene Display-Modi:
normal, d.h. reiner ASCII-Text (:dis normal)
ASCII-Text mit Syntax Highlighting für C, C++, Java, Makefile, awk, Tcl u.a (:dis syntax)
Hex-Dump, damit nutzbar als Hex-Editor (:dis hex)
relativ einfacher HTML-Viewer (:dis html)
einfacher Formatierer für Manual-Pages, vergleichbar mit nroff -man (:dis man)
Drucken von Files auf einer Vielzahl von Druckern (:lp)