Diese Frage folgt direkt aus der Antwort . In diesem Fall kann ich den folgenden Teil nicht verstehen:
In dieser Hinsicht ähnelt sein Verhalten eher dem von emacs als dem von bash (readline) / ksh / zsh emacs, weicht jedoch vom eingebetteten Ctrl-WZeileneditor des Terminaltreibers (im kanonischen Modus) ab, in dem das vorherige Wort (werase, auch in vi) gelöscht wird ).
Hier geht es um Shells und nicht um Editoren, bei denen es sich um zwei völlig verschiedene Programme handelt. Was bedeutet es zu sagen, dass sich die Shell in einem Editor-Modus befindet?
PS: Sie können Ihre Antwort auf die Voraussetzung stützen, dass ich verstehe, was eine Shell ist und wie Sie vim für die grundlegende Bearbeitung verwenden.
shell
command-line
vim
keyboard-shortcuts
vi-mode
Aussenseiter
quelle
quelle
Antworten:
Im "vi" -Modus können Sie die aktuelle Shell-Eingabeaufforderung wie eine Zeile im vi-Editor bearbeiten / navigieren. Sie können es wie eine einzeilige Textdatei betrachten. Analog können Sie im "Emacs" -Modus die aktuelle Befehlszeile mit (einigen) Verknüpfungen von Emacs bearbeiten / navigieren.
Beispiel
Im vi-Modus können Sie beispielsweise Folgendes tun (in bash):
Im Emacs-Modus können Sie zB Ctrl+ Adrücken, um an den Anfang einer Zeile zu springen (vi: Ctrl+ [, 0oder ESC, 0). Sie können den Emacs-Modus über aktivieren
set -o emacs
(in bash, ksh, zsh usw.).Zeile lesen
Viele interaktive Befehlszeilenprogramme (einschließlich Bash ) verwenden die readline- Bibliothek. Auf diese Weise können Sie konfigurieren, welcher Eingabemodus (vi oder emacs) und andere Optionen an einem Ort verwendet werden sollen, sodass jedes Programm, das readline verwendet, über genau dieselbe Bearbeitungs- / Navigationsoberfläche verfügt.
Zum Beispiel sieht meine readline Konfiguration so aus:
Zum Beispiel verwendet zsh / ksh meines Wissens nicht readline, sondern unterstützt auch vi / emacs-Modi, die denen von bash / readline sehr ähnlich sind.
Natürlich ist der vi / emacs-Modus in einer Kommandozeilen-Shell nur eine Teilmenge des gesamten Funktionsumfangs des Editors. Nicht alle Funktionen sind in einer Befehlszeilen-Shell sinnvoll, und einige Funktionen sind schwieriger zu unterstützen als andere.
Kanonischer Modus
Bevor vi / emacs-Modi für interaktive Befehlszeilen-Shells "erfunden" wurden, verwendete Ihre Shell nur den kanonischen Modus Ihres Terminals, der nur einen begrenzten Satz von Bearbeitungsbefehlen enthält (z. B. Ctrl+ W, um das letzte Wort zu löschen).
quelle
set -o | grep 'emacs\|vi'
. In zsh (wo ich vi-mode habe) funktioniert das allerdings nicht.Sie werden bemerken, dass, wenn Sie
cat
an einer Shell-Eingabeaufforderung auf einem Terminalcat
schreiben, was von stdin gelesen wird, und drücken a, Sie eina
Echo vom Terminal-Treiber sehen, abercat
das nicht schreibena
(sehen Sie nur einea
, die vom Terminal-Treiber wiedergegeben wird).Wenn Sie jedoch etwas eingeben a Backspace b Enter, sehen Sie keine
cat
Ausgabea\010b\015
, sondernb\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 überioctl()
Systemaufrufe wie bei Verwendung desstty
Befehls konfiguriert werden . Wenn Sie beispielsweise den kanonischen Modus verlassen möchten, können Sie dies tunstty -icanon
. Wenn Sie tun:Dann sehen Sie gleichzeitig die
echo
(mit der Sie möglicherweise deaktiviert habenstty -echo
) und diecat
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
:^H
oder^?
normalerweise): Löscht das vorherige Zeichen^U
normalerweise): Leer (kill) der bisher eingegebenen Zeile^W
): löscht das vorherige Wort^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
undvi
sind die beliebtesten visuellen Texteditoren mit völlig unterschiedlichen Tastenkombinationen und Bedienungsmodi. Invi
haben Sie einen Modus zur Texteingabe und einen zur Bearbeitung. In wechselnemacs
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
odervi
) 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 :
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 vontcsh
(tcsh
ursprünglich nuremacs
Schlüsselbindung,vi
Modus wurde später hinzugefügt) und späterbash
undzsh
in den frühen 90er Jahren.Sie wechseln zwischen den beiden Modi
bash
,zsh
oderksh
mitset -o vi
oderset -o emacs
, und mitbindkey -e
oderbindkey -v
intcsh
oderzsh
.POSIX spezifiziert tatsächlich den
vi
Modus und nicht denemacs
Modus fürsh
(in der Geschichte hat Richard Stallman Einwände gegen POSIX erhoben, als er denemacs
Modus für spezifiziertesh
).Der Standardmodus für
bash
, die Public Domain-Varianten vonksh
(pdksh, mksh, oksh)tcsh
undzsh
ist der Emacs-Modus (obwohl mitzsh
, es ist,vi
wenn es Ihr$EDITOR
istvi
), während in der AT & Tksh
, es ist der dumme Modus, es sei denn,$EDITOR
oder$VISUAL
erwähntvi
oderemacs
.ksh
Außerdem wurde später eingmacs
Modus hinzugefügt , um Benutzern von Gosling Rechnung zu tragenemacs
, die Ctrl+Tanders handelten.Jetzt geht der Umgang mit
^W
imemacs
oder imtcsh
Emacs-Modus wahrscheinlich demwerase
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ögenemacs
,tcsh
oderinfo
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.quelle
pdksh
parst auch$EDITOR
fürvi
und wechselt zwischen den Modi beim Start; Ich habe das für entferntmksh
(zumal ich sowieso nur den Emacs-Modus wirklich pflege).^W
Schließen von Fenstern).