Así que estoy escribiendo una emulación de terminal (lo sé, debería compilar masilla, etc.) y estoy en la etapa de avanzar más rápido para asegurarme de que sea correcto. Lo estoy basando en el VT102 por ahora, pero agregaré características de terminal posteriores, como el color, cuando lo básico funcione correctamente.
El conjunto de comandos es principalmente ANSI. DEC tenía su propio conjunto de comandos, pero era compatible con los comandos ANSI de alrededor de 1973. Esos estándares ANSI aparentemente no están disponibles ahora, pero los equivalentes de ECMA sí, los tengo (ECMA-48 parece más relevante) pero no responde esta pregunta hasta donde yo puede ver. La mayoría de las secuencias de comandos ANSI comienzan con ESC. Muchos comandos comienzan con el identificador de secuencia de comandos que se muestra aquí como CSI y se representa en los datos como 0x1c 0x5b (ESC [
) o 0xdb si era posible la comunicación de 8 bits. Luego siguió una secuencia que identifica el comando. Algunos comandos afectan la posición del cursor, otros la pantalla, otros provocan una respuesta al host, etc.
Algunos comandos de terminal incluyen un argumento numérico. Ejemplo CSI 10 ; 5 H
significa hacer que la posición del cursor sea la fila 10, columna 5. Cuando falta el argumento numérico, debe usarse un valor predeterminado: CSI 10 ; H
significa hacer que la posición del cursor sea la fila 10, columna 1 porque 1 es el valor predeterminado cuando no se proporciona un argumento.
Tengo el manual vt102 de vt100.net (excelente recurso) y alrededor de una docena de páginas que brindan información parcial sobre estas secuencias de comandos. Aparentemente, la especificación completa de la terminal DEC gospel nunca salió de DEC.
Lo que está claro es que CSI C
es mover el cursor hacia la derecha y que el valor predeterminado es 1.
Lo que no está claro es cuál es el significado de CSI 0 C
.
¿Por qué tener un cero allí, parece que el comando no hace nada? Si significa "usar el valor predeterminado", entonces podría haberse enviado como 1, pero la cadena más corta no tendría ningún argumento y se basaría en que el valor predeterminado se interprete como 1 de todos modos. ¡Estos terminales VT físicos reales a menudo se usaban a 300 baudios y menos, por lo que el único personaje importaba!
No estoy tan avanzado como para probarlo en ambos sentidos y ver qué hace que todo sea perfecto, pero estoy lo suficientemente lejos como para que pequeñas preguntas como esta empiecen a importar.
fuente
[
, que puede codificarse como la secuencia de dos caracteresESC [
o como[
con el conjunto de 8 bits. (Algunos modelos solo pueden ser compatiblesESC [
) No sé quéCSI 0 C
hizo en el vt102; en xterm es equivalente aCSI 1 C
. Sospecho, pero no estoy seguro, que 0 y la ausencia de un valor se analizan de forma idéntica en algún momento (pienseatoi
). ¿Buscó comentarios en la fuente xterm?Respuestas:
Me puse en contacto con Thomas Dickey (invisible-island.net) que mantiene xterm y vttest; me explicó que
CSI 0 C
es lo mismo queCSI 1 C
oCSI C
en xterm.Para cualquier persona que busque más información sobre la programación de terminales, le recomiendo que consulte la fuente xterm que alberga, específicamente ctlseqs.txt dentro de xterm, que se parece mucho a la referencia de secuencias de control de terminal que he estado buscando.
fuente
¿Por qué la compatibilidad de código duro para un tipo de terminal específico cuando ya tiene una base de datos que asigna la funcionalidad a secuencias de código específicas para muchos terminales diferentes? (la base de datos terminfo generalmente está en / usr / share y se incluye en la mayoría de las distribuciones ncurses). Cualquier recurso sobre maldiciones debe explicar la forma en que se etiquetan estas funciones.
Tenga en cuenta que los archivos terminfo generalmente se compilan (usando tic), por lo que es posible que tenga que cavar un poco para encontrar los archivos fuente terminfo.
Ver también http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (hay un enlace en su a un repositorio de archivos terminfo.src)
fuente