DEC ANSI-Befehlssequenzfragen; Cursorbewegung

8

Ich schreibe also eine Terminalemulation (ich weiß, ich sollte nur Kitt kompilieren usw.) und bin gerade dabei, vttest zu durchlaufen, um sicherzustellen, dass es richtig ist. Ich stütze mich vorerst auf den VT102, werde aber später Terminalfunktionen wie Farbe hinzufügen, wenn die Grundlagen richtig funktionieren.

Der Befehlssatz ist meistens ANSI. DEC hatte einen eigenen Befehlssatz, unterstützte jedoch die ANSI-Befehle von etwa 1973. Diese ANSI-Standards sind anscheinend derzeit nicht verfügbar, aber die ECMA-Äquivalente sind, ich habe sie (ECMA-48 scheint am relevantesten zu sein), beantwortet diese Frage jedoch nicht, soweit ich kann sehen. Die meisten ANSI-Befehlssequenzen beginnen mit ESC. Viele Befehle beginnen mit der hier als CSI angezeigten Befehlssequenzkennung, die in den Daten als 0x1c 0x5b (ESC [) oder 0xdb dargestellt wird, wenn eine 8-Bit-Kommunikation möglich war. Dann folgte eine Sequenz, die den Befehl identifizierte. Einige Befehle wirken sich auf die Cursorposition aus, andere auf den Bildschirm, andere auf den Host und so weiter.

Einige Terminalbefehle enthalten ein numerisches Argument. Beispiel CSI 10 ; 5 Hbedeutet, dass die Cursorposition Zeile 10, Spalte 5 erstellt wird. Wenn das numerische Argument fehlt, muss ein Standardwert verwendet werden: CSI 10 ; Hbedeutet, dass die Cursorposition Zeile 10, Spalte 1 erstellt wird, da 1 der Standardwert ist, wenn kein Argument angegeben wird.

Ich habe das vt102-Handbuch von vt100.net (großartige Ressource) und ungefähr ein Dutzend Seiten, die teilweise Informationen zu diesen Befehlssequenzen enthalten. Anscheinend hat es die komplette Gospel-DEC-Terminalspezifikation nie aus DEC geschafft.

Klar ist, dass der CSI CCursor nach rechts bewegt wird und der Standardwert 1 ist.

Was nicht klar ist, ist die Bedeutung von CSI 0 C.

Warum dort eine Null haben, scheint der Befehl nichts zu tun? Wenn es "Standardwert verwenden" bedeutet, könnte es stattdessen als 1 gesendet worden sein, aber die kürzere Zeichenfolge hätte kein Argument und würde davon abhängen, dass der Standardwert trotzdem als 1 interpretiert wird. Diese tatsächlichen physischen VT-Terminals wurden häufig bei 300 Baud und darunter verwendet, sodass das eine Zeichen eine Rolle spielte!

Ich bin mit vttest nicht so weit fortgeschritten, dass ich es einfach in beide Richtungen versuchen und sehen kann, was alles perfekt macht, aber ich bin weit genug, dass kleine Fragen wie diese anfangen, wichtig zu werden.

Adam Eberbach
quelle
2
Terminologie-Hinweis: CSI ist Escape- [, das entweder als zweistellige Sequenz ESC [oder wie [mit dem gesetzten 8. Bit codiert werden kann . (Einige Modelle unterstützen möglicherweise nur ESC [) Ich weiß nicht, was CSI 0 Cauf dem vt102 getan hat; auf xterm ist es äquivalent zu CSI 1 C. Ich vermute, weiß aber nicht genau, dass 0 und das Fehlen eines Wertes irgendwann identisch analysiert werden (denken Sie nach atoi). Haben Sie in der xterm-Quelle nach Kommentaren gesucht?
Gilles 'SO - hör auf böse zu sein'
Absolut korrekt, danke für die Bearbeitung und ich erwarte, dass ich mir eine Quelle ansehen muss, um weitere Hinweise zu erhalten.
Adam Eberbach

Antworten:

4

Ich habe mich mit Thomas Dickey (unsichtbar-island.net) in Verbindung gesetzt, der xterm und vttest verwaltet - er erklärte, dass dies CSI 0 Cdasselbe ist wie CSI 1 Coder CSI Cin xterm.

Für alle, die weitere Informationen zur Terminalprogrammierung suchen, empfehle ich dringend, die von ihm gehostete xterm-Quelle zu überprüfen - insbesondere die ctlseqs.txt in xterm, die der von mir gesuchten Referenz für echte Terminalsteuerungssequenzen sehr ähnlich sieht.

Adam Eberbach
quelle
Diese Quelldatei war für mich hilfreich, um den CSI-Code zu ermitteln. Die Information über die CSI , die als 0x9b Byte aus der erwähnten ctlseqs.txt dargestellt wird, scheint falsch zu sein, es ist tatsächlich 0x1b
Hi-Angel
1

Warum Hardcode-Kompatibilität für einen bestimmten Terminaltyp, wenn Sie bereits eine Datenbank haben, die die Funktionalität bestimmten Codesequenzen für viele verschiedene Terminals zuordnet? (Die terminfo-Datenbank befindet sich normalerweise in / usr / share und ist in den meisten ncurses-Distributionen enthalten.) Jede Ressource zu Flüchen sollte erklären, wie diese Funktionen gekennzeichnet sind.

Beachten Sie, dass Terminfo-Dateien normalerweise kompiliert werden (mit tic), sodass Sie möglicherweise ein wenig graben müssen, um die Terminfo-Quelldateien zu finden.

Siehe auch http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (es gibt einen Link zu einem Repository von terminfo.src-Dateien)

symcbean
quelle
Das Gerät, auf dem ich das Terminal anbringe, hat weder terminfo noch ncurses, und das Schreiben einer bestimmten Terminalemulation scheint der beste Weg zu sein, Netback darauf laufen zu lassen. Es gibt bereits Nethacks für das iPad, aber ich möchte es nur mit einer Tastatur im DECgraphics-Modus spielen können, anstatt mit einer GUI mit Touch-Steuerungsschema, wie sie alle zu haben scheinen. Ich erwarte nicht, dass dies die Welt in Brand setzen wird, aber so möchte ich Nethack spielen.
Adam Eberbach
1
Nein - ich sage nicht, dass es einen Eintrag in terminfo für Ihre Hardware geben sollte - es wird einen Eintrag für einen VT102 geben, obwohl alle Befehlssequenzen beschrieben werden, die Nethack oder eine andere fluchbasierte Anwendung verwenden wird.
Symcbean
Ah, danke - das wäre eine gute kompakte Referenz.
Adam Eberbach