Sie werden bemerken, dass, wenn Sie cat
an einer Shell-Eingabeaufforderung auf einem Terminal cat
schreiben, was von stdin gelesen wird, und drücken a, Sie ein a
Echo vom Terminal-Treiber sehen, aber cat
das 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 cat
Ausgabe a\010b\015
, sondern b\012
( b
und 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 stty
Befehls 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 cat
Ausgabe.
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 (
^H
oder ^?
normalerweise): Löscht das vorherige Zeichen
- kill (
^U
normalerweise): 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 cat
oben 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 emacs
und vi
sind die beliebtesten visuellen Texteditoren mit völlig unterschiedlichen Tastenkombinationen und Bedienungsmodi. In vi
haben Sie einen Modus zur Texteingabe und einen zur Bearbeitung. In wechseln emacs
Sie immer in den Textmodus, die Bearbeitung erfolgt jedoch durch Drücken von Tastenkombinationen ( ^b
um 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 ( emacs
oder 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. ksh
war 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
( tcsh
ursprünglich nur emacs
Schlüsselbindung, vi
Modus wurde später hinzugefügt) und später bash
und zsh
in den frühen 90er Jahren.
Sie wechseln zwischen den beiden Modi bash
, zsh
oder ksh
mit set -o vi
oder set -o emacs
, und mit bindkey -e
oder bindkey -v
in tcsh
oder zsh
.
POSIX spezifiziert tatsächlich den vi
Modus und nicht den emacs
Modus für sh
(in der Geschichte hat Richard Stallman Einwände gegen POSIX erhoben, als er den emacs
Modus für spezifiziertesh
).
Der Standardmodus für bash
, die Public Domain-Varianten von ksh
(pdksh, mksh, oksh) tcsh
und zsh
ist der Emacs-Modus (obwohl mit zsh
, es ist, vi
wenn es Ihr $EDITOR
ist vi
), während in der AT & T ksh
, es ist der dumme Modus, es sei denn, $EDITOR
oder $VISUAL
erwähnt vi
oder emacs
.
ksh
Außerdem wurde später ein gmacs
Modus hinzugefügt , um Benutzern von Gosling Rechnung zu tragen emacs
, die Ctrl+Tanders handelten.
Jetzt geht der Umgang mit ^W
im emacs
oder im tcsh
Emacs-Modus wahrscheinlich dem werase
Zeichen 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
, tcsh
oder info
verhalten 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.