Sie werden bemerken, dass, wenn Sie catan einer Shell-Eingabeaufforderung auf einem Terminal catschreiben, was von stdin gelesen wird, und drücken a, Sie ein aEcho vom Terminal-Treiber sehen, aber catdas nicht schreiben a(sehen Sie nur eine a, die vom Terminal-Treiber wiedergegeben wird).
Wenn Sie jedoch etwas eingeben a Backspace b Enter, sehen Sie keine catAusgabe a\010b\015, sondern b\012( bund Zeilenvorschub).
Das ist , weil der Terminal - Treiber (wir reden Software im Kernel, nicht in dem Terminal - Emulator wie xterm) implementiert einen sehr einfacher Zeileneditor , wenn im kanonischen Modus. Der Terminaltreiber kann über ioctl()Systemaufrufe wie bei Verwendung des sttyBefehls konfiguriert werden . Wenn Sie beispielsweise den kanonischen Modus verlassen möchten, können Sie dies tun stty -icanon. Wenn Sie tun:
stty -icanon; cat
Dann sehen Sie gleichzeitig die echo(mit der Sie möglicherweise deaktiviert haben stty -echo) und die catAusgabe.
Dieser Editor ist ein Zeileneditor. Das heißt, der Benutzer muss eine Textzeile bearbeiten, bis diese beim Drücken von an die Anwendung gesendet wird, die das Endgerät liest Enter.
Die Bearbeitungsmöglichkeiten dieses Editors sind sehr begrenzt. In den meisten Implementierungen gibt es nur 4 Bearbeitungstasten (tatsächlich Zeichen), die auch konfiguriert werden können mit stty:
- Löschen (
^Hoder ^?normalerweise): Löscht das vorherige Zeichen
- kill (
^Unormalerweise): Leer (kill) der bisher eingegebenen Zeile
- werase (
^W): löscht das vorherige Wort
- lnext (
^V): Geben Sie das nächste Zeichen buchstäblich ein (heben Sie die spezielle Bedeutung aller oben genannten Zeichen auf)
Früher wurde angenommen, dass dieser Terminal-Treiber-Zeileneditor um ausgefeiltere Funktionen erweitert wird. Aus diesem Grund verfügt keine der frühen Shells über Befehlszeilen-Bearbeitungsfunktionen (Sie erhalten an der Shell-Eingabeaufforderung dieselben Funktionen wie bei der catoben beschriebenen Ausführung ).
Dies ist jedoch wirklich nie geschehen, möglicherweise liegt dies daran, dass verschiedene Terminals bei einigen Tastendrücken nicht die gleichen Zeichen senden. Dies hat gezeigt, dass dies nicht im Kernel-Space implementiert werden sollte.
Deshalb haben einige Shells begonnen, den kanonischen Modus des Terminal-Treibers aufzuheben und einen eigenen Zeileneditor zu implementieren. Zu dieser Zeit waren emacsund visind die beliebtesten visuellen Texteditoren mit völlig unterschiedlichen Tastenkombinationen und Bedienungsmodi. In vihaben Sie einen Modus zur Texteingabe und einen zur Bearbeitung. In wechseln emacsSie immer in den Textmodus, die Bearbeitung erfolgt jedoch durch Drücken von Tastenkombinationen ( ^bum das Zeichen rückwärts zu bewegen).
Zu dieser Zeit hatten Muscheln keinen Grund, sich eine andere Schlüsselbindung auszudenken. Das hätte die Leute frustriert, wenn sie etwas anderes gelernt hätten. Die Auswahl eines ( emacsoder vi) Stils gegenüber dem anderen wäre jedoch ein sicherer Weg gewesen, die Benutzer des anderen Editors zu entfremden .
Laut https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Die beliebten Inline-Bearbeitungsfunktionen (vi und emacs-Modus) von ksh wurden von Software-Entwicklern bei Bell Laboratories entwickelt. Der vi-Zeilenbearbeitungsmodus von Pat Sullivan und der emacs-Zeilenbearbeitungsmodus von Mike Veach. Beide hatten die Bourne-Shell unabhängig voneinander geändert, um diese Funktionen hinzuzufügen, und beide befanden sich in Organisationen, die ksh nur verwenden wollten, wenn ksh über ihren jeweiligen Inline-Editor verfügte. Ursprünglich wurde die Idee, die Befehlszeilenbearbeitung zu ksh hinzuzufügen, in der Hoffnung abgelehnt, dass die Zeilenbearbeitung in den Terminal-Treiber verschoben wird. Als sich jedoch herausstellte, dass dies nicht in Kürze eintreten würde, wurden beide Zeilenbearbeitungsmodi in ksh integriert und als optional festgelegt, sodass sie auf Systemen deaktiviert werden konnten, die die Bearbeitung als Teil der Terminalschnittstelle bereitstellten.
Stattdessen implementierten sie beide und eine Schnittstelle, über die Benutzer zwischen beiden wählen können. kshwar höchstwahrscheinlich der erste in den frühen 80ern (Wiederverwendung von Code, der separat geschrieben wurde, um der Bourne-Shell einen vi-Modus und einen emacs-Modus hinzuzufügen, wie oben gezeigt), gefolgt von tcsh( tcshursprünglich nur emacsSchlüsselbindung, viModus wurde später hinzugefügt) und später bashund zshin den frühen 90er Jahren.
Sie wechseln zwischen den beiden Modi bash, zshoder kshmit set -o vioder set -o emacs, und mit bindkey -eoder bindkey -vin tcshoder zsh.
POSIX spezifiziert tatsächlich den viModus und nicht den emacsModus für sh(in der Geschichte hat Richard Stallman Einwände gegen POSIX erhoben, als er den emacsModus für spezifiziertesh ).
Der Standardmodus für bash, die Public Domain-Varianten von ksh(pdksh, mksh, oksh) tcshund zshist der Emacs-Modus (obwohl mit zsh, es ist, viwenn es Ihr $EDITORist vi), während in der AT & T ksh, es ist der dumme Modus, es sei denn, $EDITORoder $VISUALerwähnt vioder emacs.
kshAußerdem wurde später ein gmacsModus hinzugefügt , um Benutzern von Gosling Rechnung zu tragen emacs, die Ctrl+Tanders handelten.
Jetzt geht der Umgang mit ^Wim emacsoder im tcshEmacs-Modus wahrscheinlich dem weraseZeichen im Terminalzeilen-Editor voraus , daher können wir ihnen nicht wirklich die Schuld geben, und meine Aussage über "Abschied ..." kann als irreführend angesehen werden. Es ist nur so , dass ich finde es irritierend , wenn die Dinge mögen emacs, tcshoder infoverhalten sich anders als alles andere , wenn Sie eingeben Ctrl-W. Sie können sich vorstellen, dass ich es viel ärgerlicher fand, als einige Anwendungen ihr Fenster schlossen, als Sie tippten Ctrl-W.