Perguntas da sequência de comandos DEC ANSI; movimento do cursor

8

Então, eu estou escrevendo uma emulação de terminal (eu sei, eu devo apenas compilar massa, etc.) e estou no estágio de vasculhar o vttest para garantir que esteja certo. Estou baseando-o no VT102 por enquanto, mas adicionarei mais tarde recursos de terminal, como cores, quando o básico estiver funcionando corretamente.

O conjunto de comandos é principalmente ANSI. O DEC tinha seu próprio conjunto de comandos, mas suportou os comandos ANSI desde 1973. Esses padrões ANSI aparentemente não estão disponíveis agora, mas os equivalentes ECMA estão, eu os tenho (o ECMA-48 parece ser mais relevante), mas não responde a essa pergunta na medida em que eu pode ver. A maioria das seqüências de comandos ANSI começa com ESC. Muitos comandos começam com o identificador de sequência de comandos mostrado aqui como CSI e representado nos dados como 0x1c 0x5b (ESC [) ou 0xdb se a comunicação de 8 bits for possível. Em seguida, seguiu uma sequência identificando o comando. Alguns comandos afetam a posição do cursor, alguns na tela, outros provocam uma resposta ao host e assim por diante.

Alguns comandos do terminal incluem um argumento numérico. Exemplo CSI 10 ; 5 Hsignifica colocar a posição do cursor na linha 10, coluna 5. Quando o argumento numérico está ausente, há um valor padrão a ser usado: CSI 10 ; Hsignifica colocar a posição do cursor na linha 10, coluna 1, porque 1 é o valor padrão quando um argumento não é fornecido.

Eu tenho o manual vt102 do vt100.net (ótimo recurso) e cerca de uma dúzia de páginas fornecendo informações parciais sobre essas seqüências de comando. Aparentemente, a especificação completa do terminal DEC do evangelho nunca saiu do DEC.

O que está claro é que CSI Cé mover o cursor para a direita e que o valor padrão é 1.

O que não está claro é qual é o significado de CSI 0 C.

Por que ter um zero lá, parece que o comando não faz nada? Se isso significa "usar o valor padrão", ele poderia ter sido enviado como 1, mas a cadeia mais curta não teria argumento e dependeria do valor padrão ser interpretado como 1 de qualquer maneira. Esses terminais físicos reais do VT eram frequentemente usados ​​a 300 bauds e abaixo, de modo que o único caractere importava!

Não sou tão avançado com o vttest que posso apenas tentar dos dois lados e ver o que torna tudo perfeito, mas estou longe o suficiente para que pequenas perguntas como essa estejam começando a importar.

Adam Eberbach
fonte
2
Nota de terminologia: CSI é escape- [, que pode ser codificado como a sequência de dois caracteres ESC [ou como [no conjunto de 8 bits. (Alguns modelos podem suportar apenas ESC [) Não sei o que CSI 0 Cfez no vt102; no xterm é equivalente a CSI 1 C. Eu suspeito, mas não sei ao certo, que 0 e a ausência de um valor são analisados ​​de forma idêntica em algum momento (pense atoi). Você procurou comentários na fonte xterm?
Gilles 'SO- stop be evil'
Absolutamente correto, obrigado pela edição e espero que eu precise procurar alguma fonte para obter mais algumas dicas.
Adam Eberbach 22/09

Respostas:

4

Entrei em contato com Thomas Dickey (invisible-island.net), que mantém o xterm e o vttest - ele explicou que CSI 0 Cé o mesmo que CSI 1 Cou CSI Cno xterm.

Para quem procura mais informações sobre programação de terminais, recomendo verificar a fonte xterm que ele hospeda - especificamente o ctlseqs.txt dentro do xterm, que se parece muito com a única referência verdadeira de sequências de controle de terminal que eu estava procurando.

Adam Eberbach
fonte
Esse arquivo de origem foi útil para eu descobrir qual é o código CSI; as informações sobre o CSI sendo representado como byte 0x9b do mencionado ctlseqs.txt parece estar errado, ele realmente é 0x1b
Hi-Angel
1

Por que compatibilidade com hardcode para um tipo de terminal específico quando você já possui um banco de dados mapeando a funcionalidade para sequências de código específicas para vários terminais diferentes? (o banco de dados terminfo geralmente está em / usr / share e está incluído na maioria das distribuições ncurses). Qualquer recurso sobre maldições deve explicar como essas funções são rotuladas.

Observe que os arquivos terminfo geralmente são compilados (usando o tic); portanto, talvez você precise cavar um pouco para encontrar os arquivos de origem terminfo.

Veja também http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (existe um link no repositório de arquivos terminfo.src)

symcbean
fonte
O dispositivo no qual estou colocando o terminal não possui terminfo ou ncurses, e escrever uma emulação de terminal específica parece ser a melhor maneira de fazer com que o netback execute nele. Já existem nethacks para o iPad, mas eu só quero tocá-lo com um teclado no modo DECgraphics, em vez de qualquer GUI com esquema de controle de toque, como todos parecem ter. Não espero que isso atire fogo ao mundo, mas é assim que quero jogar nethack.
Adam Eberbach 22/09
1
Não - não estou dizendo que deve haver uma entrada no terminfo para o seu hardware - haverá uma entrada para um VT102, embora descreva todas as seqüências de comando que o nethack ou qualquer outro aplicativo baseado em maldições usará.
symcbean 26/09/11
Ah, obrigado - isso seria uma boa referência compacta.
Adam Eberbach