Questions de séquence de commandes DEC ANSI; mouvement du curseur

8

J'écris donc une émulation de terminal (je sais, je devrais simplement compiler du mastic, etc.) et je suis au stade de parcourir le vttest pour m'assurer que c'est bien. Je le base sur le VT102 pour l'instant, mais j'ajouterai des fonctionnalités de terminal ultérieures telles que la couleur lorsque les bases fonctionnent correctement.

Le jeu de commandes est principalement ANSI. DEC avait son propre jeu de commandes mais a pris en charge les commandes ANSI vers 1973. Ces normes ANSI ne sont apparemment pas disponibles maintenant mais les équivalents ECMA le sont, je les ai (ECMA-48 semble le plus pertinent) mais ne répond pas à cette question pour autant que je peut voir. La plupart des séquences de commandes ANSI commencent par ESC. De nombreuses commandes commencent par l'identificateur de séquence de commandes indiqué ici en tant que CSI et représenté dans les données par 0x1c 0x5b (ESC [) ou 0xdb si une communication 8 bits était possible. Puis a suivi une séquence identifiant la commande. Certaines commandes affectent la position du curseur, certaines l'écran, certaines provoquent une réponse à l'hôte et ainsi de suite.

Certaines commandes de terminal incluent un argument numérique. Exemple CSI 10 ; 5 Hsignifie que la position du curseur est rangée 10, colonne 5. Lorsque l'argument numérique est manquant, il y a une valeur par défaut à utiliser: CSI 10 ; Hsignifie que la position du curseur est rangée 10, colonne 1 car 1 est la valeur par défaut quand aucun argument n'est donné.

J'ai le manuel vt102 de vt100.net (grande ressource) et environ une douzaine de pages donnant des informations partielles sur ces séquences de commandes. Apparemment, les spécifications complètes du terminal DEC de l'Évangile ne sont jamais sorties du DEC.

Ce qui est clair, c'est que CSI Cdéplacer le curseur vers la droite et que la valeur par défaut est 1.

Ce qui n'est pas clair, c'est quelle est la signification de CSI 0 C.

Pourquoi avoir un zéro là-bas, il semblerait que la commande ne fasse rien? S'il signifie «utiliser la valeur par défaut», il aurait pu être envoyé à la place, mais la chaîne plus courte n'aurait aucun argument et compterait sur la valeur par défaut interprétée comme 1 de toute façon. Ces terminaux physiques physiques réels étaient souvent utilisés à 300 bauds et en dessous, donc le seul caractère comptait!

Je ne suis pas si avancé avec vttest que je peux simplement l'essayer dans les deux sens et voir ce qui rend tout parfait, mais je suis assez loin pour que de petites questions comme celle-ci commencent à avoir de l'importance.

Adam Eberbach
la source
2
Note terminologique: CSI est d'échappement - [, qui peut être codé soit comme la séquence de deux caractères ESC [, soit comme [avec le 8ème bit. (Certains modèles ne prennent en charge que ESC [) Je ne sais pas ce qui CSI 0 Cs'est passé sur le vt102; sur xterm, il est équivalent à CSI 1 C. Je soupçonne, mais je ne sais pas avec certitude, que 0 et l'absence de valeur sont analysés de manière identique à un moment donné (pensez atoi). Avez-vous cherché des commentaires dans la source xterm?
Gilles 'SO- arrête d'être méchant'
Absolument correct, merci pour l'édition, et attendez-vous à ce que je doive regarder une source pour obtenir plus d'indices.
Adam Eberbach

Réponses:

4

Je suis entré en contact avec Thomas Dickey (invisible-island.net) qui maintient xterm et vttest - il a expliqué que CSI 0 Cest le même que celui CSI 1 Cou CSI Cdans xterm.

Pour tous ceux qui recherchent plus d'informations sur la programmation des terminaux, je recommande fortement de vérifier la source xterm qu'il héberge - en particulier le ctlseqs.txt à l'intérieur de xterm, qui ressemble beaucoup à la véritable référence de séquences de contrôle de terminal que j'ai recherchée.

Adam Eberbach
la source
Ce fichier source m'a été utile pour trouver le code CSI; les informations sur le CSI étant représenté sous la forme d'un octet 0x9b provenant du ctlseqs.txt mentionné semblent être fausses, il s'agit en fait de 0x1b
Hi-Angel
1

Pourquoi la compatibilité du code dur pour un type de terminal spécifique alors que vous avez déjà une base de données mappant la fonctionnalité à des séquences de code spécifiques pour de nombreux terminaux différents? (la base de données terminfo se trouve généralement dans / usr / share et est incluse dans la plupart des distributions ncurses). Toute ressource sur les malédictions devrait expliquer la façon dont ces fonctions sont étiquetées.

Notez que les fichiers terminfo sont généralement compilés (en utilisant tic) donc vous devrez peut-être creuser un peu pour trouver les fichiers source terminfo.

Voir aussi http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (il y a un lien dans leur vers un référentiel de fichiers terminfo.src)

symcbean
la source
Le périphérique sur lequel je mets le terminal n'a pas de terminfo ni de ncurses, et l'écriture d'une émulation de terminal spécifique semble être le meilleur moyen de faire fonctionner netback sur celui-ci. Il existe déjà des nethacks pour iPad, mais je veux juste pouvoir y jouer avec un clavier en mode DECgraphics plutôt qu'avec n'importe quelle interface graphique avec schéma de contrôle tactile, comme tous semblent en avoir. Je ne pense pas que cela mettra le feu au monde mais c'est la façon dont je veux jouer à nethack.
Adam Eberbach
1
Non - je ne dis pas qu'il devrait y avoir une entrée dans terminfo pour votre matériel - il y aura une entrée pour un VT102 bien que décrivant toutes les séquences de commandes que nethack ou toute autre application basée sur des curseurs utilisera.
symcbean
Ah, merci - ce serait une bonne référence compacte.
Adam Eberbach,