Ich kann zwar nicht leugnen, dass ich am Anfang zu sehr mit vi zu kämpfen hatte, aber ich denke, man kann argumentieren, dass vi eigentlich sehr einfach zu erlernen ist. (Als ich anfing, Unix zu verwenden, hatte ich die Wahl zwischen vi und emacs, also war ich zu der Zeit ein sehr einfacher Zeileneditor, den ich bereits durch das Lesen früher Unix-Lehrbücher gelernt hatte.) Ich verwende vi täglich, aber wahrscheinlich Verwenden Sie nur eine sehr kleine Teilmenge seiner Funktionen.
Hier ist zunächst ein Argument für die Verwendung von vi: vi ist auf allen Systemen vorhanden, verwendet nur sehr wenige Ressourcen und kann über instabile und langsame Verbindungen verwendet werden, bei denen andere Editoren möglicherweise fehlschlagen oder langsam und unbrauchbar sind. Oder in Situationen, in denen das System kaputt ist und die Pfeiltasten nicht richtig interpretiert werden (z. B. falsche Terminfo-Einstellungen). So kann vi verwendet werden, um die zum Problem führenden Konfigurationsdateien zu reparieren, ohne vom Problem betroffen zu sein.
Und so lernen Sie eine nützliche Teilmenge von vi kennen: Erstens: Stellen Sie sich vi nicht mehr als interaktiven Terminal-GUI-Editor vor und betrachten Sie ihn als Programmiersprache für die Bearbeitung von Textdateien. Am Anfang stand "vi" für den virtuellen Modus, und vi hat ein nicht visuelles Gegenstück ex, was ein guter Anfang ist. Geben Sie an der Shell-Eingabeaufforderung ex ein (ich verwende ¬, um return darzustellen):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
Drücken Sie jetzt die Eingabetaste.
:¬
E749: empty buffer
:
Also, lassen Sie uns etwas hineinstecken. Geben Sie "a¬" ein und geben Sie eine Textzeile und dann einen Punkt in einer Zeile ein:
:a¬
Hello World¬
.¬
:
Das war der Befehl zum Anhängen. Einfach, kurz und mnemonisch. Aber es wäre schön zu sehen, was sich im Puffer befindet:
:%p¬
Hello World
:
Das war natürlich der Druckbefehl, p. % Ist eine Abkürzung für den Zeilenbereich. Vor jedem Befehl kann eine Zeilennummer oder ein Bereich stehen, für den der Befehl gelten soll. % bedeutet "alle Zeilen". $ steht für die letzte Zeile und ein Punkt für die aktuelle Zeile. Eine Zahl bedeutet diese bestimmte Zeile. Ein Bereich wird mit n, m geschrieben und eine Zahl kann addiert oder subtrahiert werden. + 1, $ - 1 bedeuten von der nächsten bis zur vorletzten Zeile. Ein Befehl, der nur aus einer Zeilennummer besteht, geht zu dieser Zeile. Hier ist die verbleibende kleine Teilmenge der Befehle, die ich verwende:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w schreibt alle (oder den gewählten Bereich von) Zeilen in eine Datei.
:1d¬
löscht Zeile 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s ersetzt einen regulären Ausdruck. Es ist gut, reguläre Ausdrücke zu kennen!
:q¬
E37: No write since last change (add ! to override)
q wird beendet. wq schreibt und beendet. q! verlässt das Programm, ohne etwas zu schreiben, und in ähnlicher Weise: w! erzwingt nach Möglichkeit einen Schreibvorgang in eine Datei.
Jetzt eine coole:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! as a command filtert die Zeilen in einen Shell-Befehl.
Und schlussendlich:
:vi¬
Ruft den VISUAL-Modus auf. Lass dich nicht täuschen. Es sieht aus wie ein Editor, ist aber immer noch nur eine interaktive Programmierschale. Sie müssen sich nur die ganze Zeit den Puffer und ein paar weitere Befehle ansehen. Im visuellen Modus zeigt a: die Eingabeaufforderung: aus dem Ex-Modus. Die Pfeiltasten (wenn sie funktionieren) bewegen sich, und wenn nicht, dann tun sie es! h links, j runter, k rauf und l rechts. 0 bewegt sich zum ersten Zeichen und ^ (denke hier an Regex!) Zum ersten Nicht-Leerzeichen in der Zeile. $ (wieder Regex!) springt ans Zeilenende. Eingabe: 999 € geht natürlich zur Zeile 999, genau wie im Ex-Modus.
"i" wechselt in den Einfügemodus, in dem jetzt anstelle von Zeilen Zeichen eingefügt werden und statt ".¬" die Escape-Taste gedrückt wird. "I" fügt am Anfang "a" nach dem Zeichen unter dem Cursor und "A" nach dem Ende der aktuellen Zeile ein. Drücken Sie immer die Esc-Taste, wenn Sie den Text eingegeben haben. "x" löscht das Zeichen unter dem Cursor und "D" löscht vom Cursor bis zum Zeilenende. "Y" zieht die aktuelle Zeile zurück (kopiert sie) und "P" fügt sie wieder ein. ": pu" macht dasselbe, aber es kann eine Zeilennummer vorangestellt werden. ": ya" ist das ex-Äquivalent von "Y" und wiederum nützlich, um auf einen Zeilenbereich anzuwenden. Ich denke, es gibt auch einen Markierungsbefehl, aber ich gebe zu, dass ich mich nicht daran erinnere. Ich vermisse es nicht.
Das obige ist, was ich benutze, und ich weiß, dass ich wahrscheinlich kein sehr "effizienter" vi Benutzer bin. Andererseits nutze ich die Vielseitigkeit von ex, um beispielsweise Konfigurationsdateien per Skript zu bearbeiten. Müssen Sie Ihren Hostnamen foo.bar.com in einer Reihe von conf-Dateien in www.foobar.com ändern?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
Ich versuche zu sagen, dass ich das Problem mit vi darin sehe, dass die Leute es als einen schwierigen Editor ansehen. Sie müssen lediglich Ihre Denkweise ein wenig ändern und es stattdessen als eine sehr einfache, aber auch sehr leistungsfähige interaktive Programmiersprache betrachten. Es ist so leistungsstark, dass Sie es selbst mit einer Teilmenge der verfügbaren Befehle optimal nutzen können - nicht nur als Editor, sondern auch als allgemeines, skriptfähiges Tool, das gut in den Rest von Unix integriert ist. Ich bezweifle, dass Nano all das tun würde - Emacs ... vielleicht.