5 Stimmen

Wie lautet der VT100-Escape-Code für die Tastaturtaste "esc" selbst?

Ich schreibe ein Skript, um durch ein textbasiertes Menüsystem zu navigieren, indem ich die telnetlib von Python für den Zugriff auf eine serielle Verbindung verwende.

Ich kann problemlos die F-Tasten drücken und dabei die Escape-Codes verwenden, z. B. F9 = " \033OX ", wobei " \033 " ist die Escape-Sequenz.

Wie kodiere ich die Tastaturtaste "esc"? Ich hätte erwartet, dass einfach " \033 ", aber das scheint nicht zu funktionieren.

8voto

Walt Stoneburner Punkte 2542

Es gibt keine "Escape-Sequenz" für die ESC-Taste auf einem VT-100 (oder anderen Terminals, die Escape-Sequenzen verwendeten).

Das Escape-Zeichen, ASCII 27, wurde verwendet, um anzuzeigen, dass die folgenden Zeichenfolgen eine besondere Bedeutung haben. Dadurch wurde das Terminal in der Regel in einen einfachen Zustandsautomaten versetzt. In der Regel wurden die eingehenden Zeichen verschluckt, bis ein alphabetisches oder symbolisches Zeichen zu sehen war, einschließlich einiger Sonderfälle wie Symbole, die ein zusätzliches Zeichen verschlucken konnten, z. B. ESC # 6 für Zeichen mit doppelter Breite.

Auf einem H-19 / VT-52-Terminal bedeutete ESC H beispielsweise "Home", ESC E "Clear Screen" und "Home", ESC J "Clear to End of Screen" usw. Die VT-100-Serie verwendete ESC [ H für "Home" und ESC [ 2 J für "Clear to End of Screen".

In Wirklichkeit bedeutete die offene eckige Klammer (es gab keine geschlossene Klammer), dass eine Liste von Argumenten, in der Regel numerischer Art, folgen würde. Die "2" in ESC [ 2 J bedeutete sowohl vom Cursor bis zum Anfang (Null) als auch vom Cursor bis zum Ende (Eins). Wenn man das J in ein K umwandelte, wurde die Zeile und nicht der Bildschirm auf die gleiche Weise gelöscht. Sie waren nicht willkürlich. Sogar ESC [ Zeile ; Spalte H würde eine numerische Zeile/Spalte nehmen, z.B. ESC [ 12; 34 H würde zu Zeile 12, Spalte 34 gehen. Wenn man sie nicht bereitstellte, wurden Standardwerte verwendet.

Theoretisch sollte der Server niemals ein bedeutungsloses verwaistes ESC-Zeichen ausgeben, da das Terminal auf eine Sequenz warten würde.

Wenn Sie eine Funktionstaste drücken, sendet das Terminal ein ESC-Zeichen, gefolgt von einer vorgefertigten Sequenz für eine Funktionstaste, einen Pfeil oder eine Aktion. ESC [ 21 ~ war zum Beispiel F10.

Damit blieb das sehr reale Problem, wie man einen buchstäblich verwaisten ESC senden kann. Es gab zwei Möglichkeiten.

Erstens: Senden Sie den ESC und verzögern Sie dann um einen bestimmten Betrag. Der Gastgeber hätte die Aufgabe, nicht nur darauf zu achten, was hereinkommt, sondern auch wann. Da er davon ausging, dass ein Terminal einen Zeichenblock in seinem Puffer sofort sendet, würde er intern eine Zeitüberschreitung feststellen und ESC einfach als ESC verstehen. Die Verzögerung brauchte nicht lang zu sein.

Zweitens: Der Benutzer muss für jede gewünschte buchstäbliche ESC zweimal ESC drücken. Da keine Escape-Sequenz jemals aus einem doppelten Escape-Zeichen bestand, signalisierte dies einen besonderen Zustand. Es ist genau dasselbe, was wir tun, wenn wir Backslash-Zeichen in Zeichenketten zitieren, ein "\" bedeutet wirklich ein "\", weil wir die lexikalische Phase des Compilers erfüllen müssen. In diesem Fall ist es der Host-Server. Denken Sie daran, dass in den Tagen der seriellen Schnittstellen, als diese Terminals in Gebrauch waren, ein Zeichen sofort gesendet wurde, wenn es gedrückt wurde. Erst Jahre später begannen wir, Terminals zu emulieren, und so entstand die Notwendigkeit, deren Escape-Sequenzen zu emulieren, anstatt das Verhalten aus dem Inhaltsstrom zu übernehmen.

Natürlich bedeutete eine "ungültige" ESC-Sequenz, dass das ESC-Zeichen buchstabengetreu war, aber dazu musste man sehen, was die folgenden Bytes waren, bevor man darauf reagieren konnte (daher die Timeout-Lösung). Das Problem ist, dass diese Zeichen manchmal unangenehme Nebeneffekte für eine Anwendung haben und interessante Fälle auftreten können, in denen der Versuch, das System naiv zu überlisten, zu Problemen führen kann. z.B. ESC-Leertaste verwenden, um die Escape-Funktion zu erzwingen.

Die dritte Lösung des Problems bestand darin, dass der Host spezielle Funktionstasten einfach ignorierte und den eingehenden Bytestrom als Literal nahm. So zeigte der TECO-Editor dem Benutzer jedes Mal, wenn die ESC-Taste gedrückt wurde, ein Dollarzeichen an, da er dieses als Befehlstrennzeichen verwendete, so wie man heute in der Programmierung ein Semikolon verwenden würde.

6voto

Fügen Sie eine kleine Verzögerung, z. B. 1,5 Sekunden, nach dem Senden der Escape-Meldung ein, damit die andere Seite erkennt, dass es sich um eine einzelne Escape-Meldung handelt und nicht um einen Teil einer längeren Sequenz.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X