Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las secuencias de terminal virtual son secuencias de caracteres de control que pueden controlar el movimiento del cursor, el color de la consola y otras operaciones cuando se escriben en el flujo de salida. También se pueden recibir secuencias en el flujo de entrada en respuesta a una secuencia de información de consulta de flujo de salida o como codificación de la entrada del usuario cuando se establece el modo adecuado.
Puede usar las funciones GetConsoleMode y SetConsoleMode para configurar este comportamiento. Al final de este documento se incluye un ejemplo de la manera sugerida de habilitar comportamientos de terminal virtual.
El comportamiento de las siguientes secuencias se basa en las tecnologías de emulador de terminal VT100 y derivadas, más específicamente en el emulador de terminal xterm. Puede encontrar más información sobre las secuencias de terminal en http://vt100.net y en http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.
Secuencias de salida
El host de consola intercepta las siguientes secuencias de terminal cuando se escriben en el flujo de salida, si la marca ENABLE_VIRTUAL_TERMINAL_PROCESSING se establece en el identificador de búfer de pantalla mediante la función SetConsoleMode . Tenga en cuenta que la marca DISABLE_NEWLINE_AUTO_RETURN también puede ser útil para simular el posicionamiento del cursor y el comportamiento de desplazamiento de otros emuladores de terminal en relación con los caracteres escritos en la columna final de cualquier fila.
Posicionamiento simple del cursor
En todas las descripciones siguientes, ESC siempre es el valor hexadecimal 0x1B. No hay espacios que se incluyan en secuencias terminales. Las secuencias de terminal individuales se pueden dividir, en cualquier posición de carácter o byte, en varias llamadas secuenciales a WriteFile o WriteConsole , pero es recomendable incluir toda la secuencia en una sola llamada. Para obtener un ejemplo de cómo se usan estas secuencias en la práctica, consulte el ejemplo al final de este tema.
En la tabla siguiente se describen secuencias de escape simples con un solo comando de acción directamente después del carácter ESC. Estas secuencias no tienen parámetros y surten efecto inmediatamente.
Todos los comandos de esta tabla suelen ser equivalentes a llamar a la API de consola SetConsoleCursorPosition para colocar el cursor.
El movimiento del cursor se enlazará mediante la ventanilla actual en el búfer. No se producirá el desplazamiento (si está disponible).
| Secuencia | Taquigrafía | Comportamiento |
|---|---|---|
| ESC M | RI | Índice inverso: realiza la operación inversa de \n, mueve el cursor hacia arriba una línea, mantiene la posición horizontal, desplaza el búfer si es necesario* |
| ESC 7 | DECSC | Guardar posición del cursor en la memoria** |
| ESC 8 | DECSR | Restaurar la posición del cursor desde la memoria** |
Nota:
* Si hay márgenes de desplazamiento establecidos, ri dentro de los márgenes se desplazará solo el contenido de los márgenes y dejará la ventanilla sin cambios. (Consulte Márgenes de desplazamiento)
**No habrá ningún valor guardado en la memoria hasta el primer uso del comando save. La única manera de acceder al valor guardado es con el comando restore.
Posicionamiento de cursores
Las tablas siguientes abarcan secuencias de tipos del introducidor de secuencia de control (CSI). Todas las secuencias CSI comienzan con ESC (0x1B) seguidas de [ (corchete izquierdo, 0x5B) y pueden contener parámetros de longitud variable para especificar más información para cada operación. Esto se representará mediante la abreviatura <n>. Cada tabla siguiente se agrupa por funcionalidad con notas debajo de cada tabla que explica cómo funciona el grupo.
Para todos los parámetros, se aplican las reglas siguientes a menos que se indique lo contrario:
- <n> representa la distancia que se va a mover y es un parámetro opcional.
- Si <n> se omite o es igual a 0, se tratará como 1.
- <n> no puede ser mayor que 32 767 (valor corto máximo)
- <n> no puede ser negativo
Todos los comandos de esta sección suelen ser equivalentes a llamar a la API de consola SetConsoleCursorPosition .
El movimiento del cursor se enlazará mediante la ventanilla actual en el búfer. No se producirá el desplazamiento (si está disponible).
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ <n> A | CUU | Cursor hacia arriba | Cursor hacia arriba por <n> |
| ESC [ <n> B | Bolo alimenticio | Cursor hacia abajo | Cursor hacia abajo por <n> |
| ESC [ <n> C | CUF | Reenvío del cursor | Avance del cursor (derecha) por <n> |
| ESC [ <n> D | CRÍA | Cursor hacia atrás | Cursor hacia atrás (izquierda) por <n> |
| ESC [ <n> E | CNL | Cursor Siguiente línea | Cursor hacia abajo <n> líneas desde la posición actual |
| ESC [ <n> F | CPL | Línea anterior del cursor | Cursor hacia arriba <n> líneas desde la posición actual |
| ESC [ <n> G | CHA | Cursor Horizontal Absolute | El cursor se mueve a <la nª>posición horizontalmente en la línea actual |
| ESC [ <n> d | VPA | Posición de línea vertical absoluta | El cursor se mueve a la nª <>posición verticalmente en la columna actual |
| ESC [ <y> ; <x> H | TAZA | Posición del cursor | *Cursor se mueve a <x>; <coordenada y> dentro de la ventanilla, donde <x> es la columna de la <línea y> |
| ESC [ <y> ; <x> f | HVP | Posición vertical horizontal | *Cursor se mueve a <x>; <coordenada y> dentro de la ventanilla, donde <x> es la columna de la <línea y> |
| ESC [ s | ANSISYSSC | Guardar cursor: emulación de Ansi.sys | **Sin parámetros, realiza una operación de guardar cursor como DECSC. |
| ESC [ u | ANSISYSRC | Restaurar cursor: emulación de Ansi.sys | **Sin parámetros, realiza una operación de cursor de restauración como DECRC. |
Nota:
*Los parámetros x<> e <y> tienen las mismas limitaciones que <n> anteriores. Si <se omiten x> e <y> , se establecerán en 1;1.
**ANSI.sys documentación histórica se puede encontrar en https://msdn.microsoft.com/library/cc722862.aspx y se implementa para mayor comodidad/compatibilidad.
Visibilidad del cursor
Los siguientes comandos controlan la visibilidad del cursor y su estado de parpadeo. Las secuencias DECTCEM suelen ser equivalentes a llamar a la API de consola SetConsoleCursorInfo para alternar la visibilidad del cursor.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ ? 12 h | ATT160 | Cursor de texto habilitar parpadear | Iniciar el parpadeo del cursor |
| ESC [ ? 12 l | ATT160 | Deshabilitar parpadeo del cursor de texto | Dejar de parpadear el cursor |
| ESC [ ? 25 h | DECTCEM | Mostrar modo de habilitación del cursor de texto | Mostrar el cursor |
| ESC [ ? 25 l | DECTCEM | Ocultar modo de habilitación del cursor de texto | Ocultar el cursor |
Sugerencia
Las secuencias de habilitación terminan en un carácter H en minúsculas (h) y las secuencias deshabilitan terminan en un carácter L en minúsculas (l).
Forma del cursor
Los siguientes comandos controlan y permiten la personalización de la forma del cursor.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ 0 SP q | DECSCUSR | Forma de usuario | Forma de cursor predeterminada configurada por el usuario |
| ESC [ 1 SP q | DECSCUSR | Bloque parpadeante | Forma de cursor de bloque parpadeante |
| ESC [ 2 SP q | DECSCUSR | Bloque estable | Forma de cursor de bloque estable |
| ESC [ 3 SP q | DECSCUSR | Subrayado parpadeante | Forma de cursor de subrayado parpadeante |
| ESC [ 4 SP q | DECSCUSR | Subrayado constante | Forma de cursor de subrayado estable |
| ESC [ 5 SP q | DECSCUSR | Barra parpadeante | Forma de cursor de barra parpadeante |
| ESC [ 6 SP q | DECSCUSR | Barra estable | Forma de cursor de barra estable |
Nota:
SP es un carácter de espacio literal (0x20) en la posición intermedia y va seguido de q (0x71) en la posición final.
Posicionamiento de ventanilla
Todos los comandos de esta sección suelen ser equivalentes a llamar a la API de consola ScrollConsoleScreenBuffer para mover el contenido del búfer de la consola.
Cautela Los nombres de comando son engañosos. El desplazamiento hace referencia a la dirección en la que se mueve el texto durante la operación, no en qué forma parecería moverse la ventanilla.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ <n> S | SU | Desplazarse hacia arriba | Desplácese hacia arriba por <n>. También conocido como movimiento panorámico hacia abajo, las nuevas líneas se rellenan desde la parte inferior de la pantalla. |
| ESC [ <n> T | SD | Desplazarse hacia abajo | Desplácese hacia abajo por <n>. También conocido como movimiento panorámico, las nuevas líneas se rellenan desde la parte superior de la pantalla. |
El texto se mueve a partir de la línea en la que está el cursor. Si el cursor está en la fila central de la ventanilla, desplácese hacia arriba movería la mitad inferior de la ventanilla e insertaría líneas en blanco en la parte inferior. Desplazarse hacia abajo movería la mitad superior de las filas de la ventanilla e insertaría nuevas líneas en la parte superior.
También es importante tener en cuenta que el desplazamiento hacia arriba y hacia abajo también se ve afectado por los márgenes de desplazamiento. Desplazarse hacia arriba y hacia abajo no afectará a ninguna línea fuera de los márgenes de desplazamiento.
El valor predeterminado para <n> es 1 y el valor se puede omitir opcionalmente.
Modificación de texto
Todos los comandos de esta sección suelen ser equivalentes a llamar a fillConsoleOutputCharacter, FillConsoleOutputAttribute y las API de consola ScrollConsoleScreenBuffer para modificar el contenido del búfer de texto.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ <n> @ | ICH | Insertar carácter | Inserte <n> espacios en la posición actual del cursor y cambie todo el texto existente a la derecha. Se quita el texto que sale de la pantalla a la derecha. |
| ESC [ <n> P | DCH | Eliminar carácter | Elimine <n> caracteres en la posición actual del cursor y cambie en caracteres de espacio desde el borde derecho de la pantalla. |
| ESC [ <n> X | ECH | Borrar carácter | <Borre n> caracteres de la posición actual del cursor sobrescribiendolos con un carácter de espacio. |
| ESC [ <n> L | Illinois | Insertar línea | Inserta n> líneas <en el búfer en la posición del cursor. La línea en la que está el cursor y las líneas debajo se desplazarán hacia abajo. |
| ESC [ <n> M | DL | Eliminar línea | Elimina n> líneas <del búfer, empezando por la fila en la que está el cursor. |
Nota:
Para IL y DL, solo se ven afectadas las líneas de los márgenes de desplazamiento (vea Márgenes de desplazamiento). Si no se establecen márgenes, los bordes de margen predeterminados son la ventanilla actual. Si las líneas se desplazan por debajo de los márgenes, se descartan. Cuando se eliminan las líneas, las líneas en blanco se insertan en la parte inferior de los márgenes, las líneas desde fuera de la ventanilla nunca se ven afectadas.
Para cada una de las secuencias, el valor predeterminado de <n> si se omite es 0.
Para los siguientes comandos, el parámetro <n> tiene 3 valores válidos:
- 0 borra de la posición actual del cursor (incluido) al final de la línea o pantalla
- 1 borra desde el principio de la línea o presentación hasta e incluye la posición actual del cursor
- 2 borra toda la línea o pantalla
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ <n> J | ED | Borrar en pantalla | Reemplace todo el texto de la ventanilla o pantalla actual especificada por n> por <caracteres de espacio |
| ESC [ <n> K | EL | Borrar en línea | Reemplace todo el texto de la línea por el cursor especificado por <n> por caracteres de espacio |
Formato de texto
Todos los comandos de esta sección suelen ser equivalentes a llamar a las API de consola SetConsoleTextAttribute para ajustar el formato de todas las escrituras futuras en el búfer de texto de salida de la consola.
Este comando es especial en que la <posición n> siguiente puede aceptar entre 0 y 16 parámetros separados por punto y coma.
Cuando no se especifica ningún parámetro, se trata igual que un único parámetro 0.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ <n> m | SGR | Establecer representación de gráficos | Establecer el formato de la pantalla y el texto según lo especificado por <n> |
La siguiente tabla de valores se puede usar en <n> para representar diferentes modos de formato.
Los modos de formato se aplican de izquierda a derecha. La aplicación de opciones de formato de competencia dará lugar a que la opción más adecuada tenga prioridad.
Para las opciones que especifican colores, los colores se usarán según se define en la tabla de colores de la consola que se puede modificar mediante la API SetConsoleScreenBufferInfoEx . Si la tabla se modifica para hacer que la posición "azul" de la tabla muestre un tono RGB de rojo, todas las llamadas a Foreground Blue mostrarán ese color rojo hasta que cambie lo contrario.
| Importancia | Descripción | Comportamiento |
|---|---|---|
| 0 | Predeterminado | Devuelve todos los atributos al estado predeterminado antes de la modificación. |
| 1 | Negrita/brillante | Aplica la marca de brillo/intensidad al color de primer plano |
| 22 | Sin negrita/brillante | Quita la marca de brillo/intensidad del color de primer plano. |
| 4 | Subrayar | Agrega subrayado |
| veinticuatro | Sin subrayado | Quita el subrayado |
| 7 | Negativa | Intercambia colores de primer plano y de fondo |
| 27 | Positivo (no negativo) | Devuelve primer plano o fondo a normal |
| 30 | Primer plano negro | Aplica negro no en negrita o brillante al primer plano |
| 31 | Primer plano rojo | Aplica rojo brillante y sin negrita al primer plano |
| 32 | Primer plano verde | Aplica un color verde brillante y no negrita al primer plano |
| 33 | Primer plano amarillo | Aplica un color amarillo brillante y no negrita al primer plano |
| 34 | Primer plano azul | Aplica el azul no negrita o brillante al primer plano |
| 35 | Magenta en primer plano | Aplica magenta sin negrita/brillante a primer plano |
| 36 | Cian en primer plano | Aplica cian no negrita/brillante al primer plano |
| 37 | Blanco en primer plano | Aplica blanco no negrita o brillante al primer plano |
| 38 | Primer plano extendido | Aplica el valor de color extendido al primer plano (consulte los detalles a continuación) |
| 39 | Valor predeterminado de primer plano | Solo se aplica la parte de primer plano de los valores predeterminados (consulte 0). |
| 40 | Fondo negro | Aplica negro no negrita o brillante al fondo |
| 41 | Fondo rojo | Aplica un color rojo brillante o sin negrita al fondo |
| 42 | Fondo verde | Aplica verde brillante o no negrita al fondo |
| 43 | Fondo amarillo | Aplica un color amarillo brillante y no negrita al fondo |
| 44 | Fondo azul | Aplica el azul no negrita o brillante al fondo |
| 45 | Magenta de fondo | Aplica magenta sin negrita/brillante a fondo |
| 46 | Cian de fondo | Aplica cian no negrita/brillante al fondo |
| 47 | Fondo blanco | Aplica blanco no negrita o brillante al fondo |
| 48 | Fondo extendido | Aplica el valor de color extendido al fondo (consulte los detalles a continuación) |
| 49 | Valor predeterminado de fondo | Solo se aplica la parte de fondo de los valores predeterminados (consulte 0). |
| 90 | Primer plano brillante negro | Aplica negrita/negro brillante al primer plano |
| 91 | Rojo en primer plano brillante | Aplica negrita/rojo brillante al primer plano |
| 92 | Brillante primer plano verde | Aplica negrita/verde brillante al primer plano |
| 93 | Primer plano brillante amarillo | Aplica negrita/amarillo brillante al primer plano |
| 94 | Primer plano brillante azul | Aplica negrita/azul brillante al primer plano |
| 95 | Bright Foreground Magenta | Aplica negrita/bright magenta a primer plano |
| 96 | Cian de primer plano brillante | Aplica cian negrita/brillante al primer plano |
| 97 | Blanco en primer plano brillante | Aplica blanco brillante o negrita al primer plano |
| 100 | Fondo brillante negro | Aplica negrita/negro brillante al fondo |
| 101 | Rojo de fondo brillante | Aplica negrita/rojo brillante al fondo |
| 102 | Fondo brillante verde | Aplica negrita/verde brillante al fondo |
| 103 | Fondo brillante amarillo | Aplica negrita/amarillo brillante al fondo |
| 104 | Fondo brillante azul | Aplica negrita/azul brillante al fondo |
| 105 | Magenta de fondo brillante | Aplica negrita/bright magenta a fondo |
| 106 | Cian de fondo brillante | Aplica cian negrita/brillante al fondo |
| 107 | Fondo brillante blanco | Aplica blanco brillante o negrita al fondo |
Colores extendidos
Algunos emuladores de terminal virtual admiten una paleta de colores mayor que los 16 colores proporcionados por la consola de Windows. Para estos colores extendidos, la consola de Windows elegirá el color más cercano adecuado de la tabla de colores existente de 16 para su visualización. A diferencia de los valores típicos de SGR anteriores, los valores extendidos consumirán parámetros adicionales después del indicador inicial según la tabla siguiente.
| Subsecuencia de SGR | Descripción |
|---|---|
| 38 ; 2 ; <r> ; <g> ; <b> | Establezca el color de primer plano en el valor RGB especificado en <r>, <g>, <b> parameters* |
| 48 ; 2 ; <r> ; <g> ; <b> | Establezca el color de fondo en el valor RGB especificado en <r>, <g>, <b> parameters* |
| 38 ; 5 ; <s> | Establezca el color <de primer plano en el índice de s> en la tabla de colores 88 o 256* |
| 48 ; 5 ; <s> | Establezca el <color de fondo en el índice de> 88 o 256 tablas de colores* |
*Las paletas de colores 88 y 256 mantenidas internamente para la comparación se basan en el emulador de terminal xterm. Las tablas de comparación y redondeo no se pueden modificar en este momento.
Colores de pantalla
El siguiente comando permite a la aplicación establecer los valores de la paleta de colores de pantalla en cualquier valor RGB.
Los valores RGB deben ser valores hexadecimales entre 0 y ffy y separados por el carácter de barra diagonal (por ejemplo, rgb:1/24/86).
Tenga en cuenta que esta secuencia es una secuencia de OSC "Comando del sistema operativo", y no csi como muchas de las otras secuencias enumeradas, y como tal comienza con "\x1b]", no "\x1b[". Como secuencias de OSC, finalizan con un terminador de cadena representado como <ST> y transmitido con ESC \ (0x1B 0x5C).
BEL (0x7) se puede usar en su lugar como terminador, pero se prefiere el formato más largo.
| Secuencia | Descripción | Comportamiento |
|---|---|---|
| ESC ] 4 ; <i> ; rgb: <r> / <g> / <b><ST> | Modificar colores de pantalla | Establece el índice <de paleta de colores de pantalla i> en los valores RGB especificados en <r>, <g>, <b> |
Cambios en modo
Estas son secuencias que controlan los modos de entrada. Hay dos conjuntos diferentes de modos de entrada, el modo de teclas de cursor y el modo de teclas del Teclado. El modo de teclas de cursor controla las secuencias emitidas por las teclas de dirección, así como inicio y fin, mientras que el modo de teclas del teclado controla las secuencias emitidas por las teclas en el teclado numérico principalmente, así como las teclas de función.
Cada uno de estos modos es una configuración booleana simple: el modo de teclas de cursor es Normal (predeterminado) o Aplicación, y el modo de claves del Teclado es Numérico (predeterminado) o Aplicación.
Consulte las secciones Teclas de cursor y Numpad y Teclas de función para ver las secuencias emitidas en estos modos.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC = | DECKPAM | Habilitar el modo de aplicación del teclado | Las teclas del teclado emitirán sus secuencias de modo de aplicación. |
| ESC > | DECKPNM | Habilitar el modo numérico del Teclado | Las teclas del teclado emitirán sus secuencias de modo numérico. |
| ESC [ ? 1 h | DECCKM | Habilitar el modo de aplicación de teclas de cursor | Las teclas del teclado emitirán sus secuencias de modo de aplicación. |
| ESC [ ? 1 l | DECCKM | Deshabilitar el modo de aplicación teclas de cursor (usar el modo normal) | Las teclas del teclado emitirán sus secuencias de modo numérico. |
Estado de consulta
Todos los comandos de esta sección suelen ser equivalentes a llamar a las API de consola Get* para recuperar información de estado sobre el estado actual del búfer de la consola.
Nota:
Estas consultas emitirán sus respuestas en el flujo de entrada de la consola inmediatamente después de reconocerse en el flujo de salida mientras se establece ENABLE_VIRTUAL_TERMINAL_PROCESSING. La marca ENABLE_VIRTUAL_TERMINAL_INPUT no se aplica a los comandos de consulta, ya que se supone que una aplicación que realiza la consulta siempre querrá recibir la respuesta.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ 6 n | DECXCPR | Posición del cursor del informe | Emita la posición del cursor como: ESC [ <r> ; <c> R Where <r> = cursor row and <c> = cursor column |
| ESC [ 0 c | Administrador de datos | Atributos de dispositivo | Informe de la identidad del terminal. Emitirá "\x1b[?1; 0c", que indica "VT101 sin opciones". |
Pestañas
Aunque la consola de Windows espera que las pestañas sean exclusivamente ocho caracteres de ancho, *nix aplicaciones que usan determinadas secuencias pueden manipular dónde se encuentran las tabulaciones dentro de las ventanas de consola para optimizar el movimiento del cursor por parte de la aplicación.
Las secuencias siguientes permiten a una aplicación establecer las ubicaciones de tabulación dentro de la ventana de la consola, quitarlas y navegar entre ellas.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC H | HTS | Conjunto de pestañas horizontales | Establece una tabulación en la columna actual en la que se encuentra el cursor. |
| ESC [ <n> I | CHT | Pestaña Horizontal del cursor (reenvío) | Avance el cursor a la siguiente columna (en la misma fila) con una tabulación. Si no hay más tabulaciones, vaya a la última columna de la fila. Si el cursor está en la última columna, vaya a la primera columna de la fila siguiente. |
| ESC [ <n> Z | CBT | Pestaña Hacia atrás del cursor | Mueva el cursor a la columna anterior (en la misma fila) con una tabulación. Si no hay más tabulaciones, mueve el cursor a la primera columna. Si el cursor está en la primera columna, no mueve el cursor. |
| ESC [ 0 g | TBC | Borrar tabulación (columna actual) | Borra la tabulación de la columna actual, si hay una. De lo contrario, no hace nada. |
| ESC [ 3 g | TBC | Borrar tabulación (todas las columnas) | Borra todas las tabulaciones establecidas actualmente. |
- Para CHT y CBT, <n> es un parámetro opcional que (default=1) indica cuántas veces se debe avanzar el cursor en la dirección especificada.
- Si no hay tabulaciones establecidas a través de HTS, CHT y CBT tratarán las primeras y últimas columnas de la ventana como las dos únicas tabulaciones.
- El uso de HTS para establecer una tabulación también hará que la consola navegue hasta la siguiente tabulación en la salida de un carácter TAB (0x09, '\t'), de la misma manera que CHT.
Designar juego de caracteres
Las secuencias siguientes permiten que un programa cambie la asignación del juego de caracteres activo. Esto permite que un programa emita caracteres ASCII de 7 bits, pero que se muestren como otros glifos en la propia pantalla del terminal. Actualmente, los dos únicos juegos de caracteres admitidos son ASCII (valor predeterminado) y el juego de caracteres gráficos especiales de DEC. Vea http://vt100.net/docs/vt220-rm/table2-4.html para obtener una lista de todos los caracteres representados por el juego de caracteres gráficos especiales de DEC.
| Secuencia | Descripción | Comportamiento |
|---|---|---|
| ESC ( 0 | Designar juego de caracteres: dibujo de línea DEC | Habilita el modo de dibujo de línea de DEC |
| ESC ( B | Designar juego de caracteres: ASCII de EE. UU. | Habilita el modo ASCII (valor predeterminado) |
En particular, el modo de dibujo de línea de DEC se usa para dibujar bordes en aplicaciones de consola. En la tabla siguiente se muestra qué caracteres ASCII se asignan a qué carácter de dibujo de líneas.
| Hex | ASCII | Dibujo de líneaS DEC |
|---|---|---|
| 0x6a | j | ┘ |
| 0x6b | k | ┐ |
| 0x6c | l | ┌ |
| 0x6d | m | └ |
| 0x6e | n | ┼ |
| 0x71 | q | ─ |
| 0x74 | t | ├ |
| 0x75 | u | ┤ |
| 0x76 | v | ┴ |
| 0x77 | w | ┬ |
| 0x78 | x | │ |
Márgenes de desplazamiento
Las secuencias siguientes permiten a un programa configurar la "región de desplazamiento" de la pantalla que se ve afectada por las operaciones de desplazamiento. Se trata de un subconjunto de las filas que se ajustan cuando la pantalla se desplaza de otro modo, por ejemplo, en una "\n" o ri. Estos márgenes también afectan a las filas modificadas por Insert Line (IL) y Delete Line (DL), Scroll Up (SU) y Scroll Down (SD).
Los márgenes de desplazamiento pueden ser especialmente útiles para tener una parte de la pantalla que no se desplaza cuando se rellena el resto de la pantalla, como tener una barra de título en la parte superior o una barra de estado en la parte inferior de la aplicación.
Para DECSTBM, hay dos parámetros opcionales, <t> y <b>, que se usan para especificar las filas que representan las líneas superior e inferior de la región de desplazamiento, inclusivas. Si se omiten los parámetros, <t> tiene como valor predeterminado 1 y <b> el alto de la ventanilla actual.
Los márgenes de desplazamiento son por búfer, por lo que, importantemente, el búfer alternativo y el búfer principal mantienen la configuración de márgenes de desplazamiento independientes (por lo que una aplicación de pantalla completa en el búfer alternativo no envenenará los márgenes del búfer principal).
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ <t> ; <b> r | DECSTBM | Establecer región de desplazamiento | Establece los márgenes de desplazamiento de VT de la ventanilla. |
Título de la ventana
Los comandos siguientes permiten a la aplicación establecer el título de la ventana de la consola en el parámetro de cadena> especificado<. La cadena debe tener menos de 255 caracteres para aceptarse. Esto equivale a llamar a SetConsoleTitle con la cadena especificada.
Tenga en cuenta que estas secuencias son secuencias de OSC "Comando del sistema operativo", y no csi como muchas de las otras secuencias enumeradas, y como tal comienza con "\x1b]", no "\x1b[". Como secuencias de OSC, finalizan con un terminador de cadena representado como <ST> y transmitido con ESC \ (0x1B 0x5C).
BEL (0x7) se puede usar en su lugar como terminador, pero se prefiere el formato más largo.
| Secuencia | Descripción | Comportamiento |
|---|---|---|
| ESC ] 0 ; <cuerda><C> | Establecer título de la ventana | Establece el título de la ventana de la consola en <cadena>. |
| ESC ] 2 ; <cuerda><C> | Establecer título de la ventana | Establece el título de la ventana de la consola en <cadena>. |
El carácter de terminación aquí es el carácter "Bell", '\x07'
Búfer de pantalla alternativo
*Las aplicaciones de estilo Nix suelen usar un búfer de pantalla alternativo para que puedan modificar todo el contenido del búfer, sin afectar a la aplicación que las inició. El búfer alternativo es exactamente las dimensiones de la ventana, sin ninguna región de desplazamiento.
Para obtener un ejemplo de este comportamiento, considere cuándo se inicia vim desde Bash. Vim usa la totalidad de la pantalla para editar el archivo y, a continuación, volver a Bash deja el búfer original sin cambios.
| Secuencia | Descripción | Comportamiento |
|---|---|---|
| ESC [ ? 1 0 4 9 h | Usar el búfer de pantalla alternativo | Cambia a un nuevo búfer de pantalla alternativo. |
| ESC [ ? 1 0 4 9 l | Usar el búfer de pantalla principal | Cambia al búfer principal. |
Ancho de ventana
Las secuencias siguientes se pueden usar para controlar el ancho de la ventana de la consola. Son aproximadamente equivalentes a la llamada a la API de consola SetConsoleScreenBufferInfoEx para establecer el ancho de la ventana.
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ ? 3 h | DECCOLM | Establecer número de columnas en 132 | Establece el ancho de la consola en 132 columnas de ancho. |
| ESC [ ? 3 l | DECCOLM | Establecer número de columnas en 80 | Establece el ancho de la consola en 80 columnas de ancho. |
Restablecimiento temporal
La secuencia siguiente se puede usar para restablecer determinadas propiedades a sus valores predeterminados. Las siguientes propiedades se restablecen a los siguientes valores predeterminados (también se enumeran las secuencias que controlan esas propiedades):
- Visibilidad del cursor: visible (DECTEM)
- Teclado numérico: modo numérico (DECNKM)
- Modo de teclas de cursor: modo normal (DECCKM)
- Márgenes superior e inferior: Top=1, Bottom=Console height (DECSTBM)
- Juego de caracteres: US ASCII
- Representación de gráficos: Valor predeterminado/desactivado (SGR)
- Guardar estado del cursor: Posición principal (0,0) (DECSC)
| Secuencia | Código | Descripción | Comportamiento |
|---|---|---|---|
| ESC [ ! p | DECSTR | Restablecimiento temporal | Restablezca determinados valores de configuración de terminal a sus valores predeterminados. |
Secuencias de entrada
El host de consola emite las siguientes secuencias de terminal en el flujo de entrada si la marca ENABLE_VIRTUAL_TERMINAL_INPUT está establecida en el identificador de búfer de entrada mediante la marca SetConsoleMode.
Hay dos modos internos que controlan qué secuencias se emiten para las claves de entrada dadas, el modo de teclas de cursor y el modo de teclas del teclado. Estos se describen en la sección Cambios en modo.
Teclas de cursor
| Clave | Modo normal | Modo de aplicación |
|---|---|---|
| Flecha arriba | ESC [ A | ESC O A |
| Flecha abajo | ESC [ B | ESC O B |
| Flecha derecha | ESC [ C | ESC O C |
| Flecha izquierda | ESC [ D | ESC O D |
| Hogar | ESC [ H | ESC O H |
| Fin | ESC [ F | ESC O F |
Además, si ctrl se presiona con cualquiera de estas teclas, se emiten en su lugar las siguientes secuencias, independientemente del modo de teclas de cursor:
| Clave | Cualquier modo |
|---|---|
| Ctrl + Flecha arriba | ESC [ 1 ; 5 A |
| Ctrl + Flecha abajo | ESC [ 1 ; 5 B |
| Ctrl + Flecha derecha | ESC [ 1 ; 5 C |
| Ctrl + Flecha izquierda | ESC [ 1 ; 5 D |
Numpad & Function Keys
| Clave | Secuencia |
|---|---|
| Retroceso | 0x7f (DEL) |
| Pausa | 0x1a (SUB) |
| Escapar | 0x1b (ESC) |
| Insertar | ESC [ 2 ~ |
| Borrar | ESC [ 3 ~ |
| Subir página | ESC [ 5 ~ |
| Página abajo | ESC [ 6 ~ |
| F1 | ESC O P |
| F2 | ESC O Q |
| F3 | ESC O R |
| F4 | ESC O S |
| F5 | ESC [ 1 5 ~ |
| F6 | ESC [ 1 7 ~ |
| F7 | ESC [ 1 8 ~ |
| F8 | ESC [ 1 9 ~ |
| F9 | ESC [ 2 0 ~ |
| F10 | ESC [ 2 1 ~ |
| F11 | ESC [ 2 3 ~ |
| F12 | ESC [ 2 4 ~ |
Modificadores
Alt se trata mediante el prefijo de la secuencia con un escape: ESC <c> donde <c> es el carácter pasado por el sistema operativo. Alt+Ctrl se controla de la misma manera, excepto que el sistema operativo tendrá desplazado previamente la <tecla c> al carácter de control adecuado que se retransmitirá a la aplicación.
Por lo general, Ctrl se pasa exactamente como se recibe del sistema. Normalmente, se trata de un solo carácter desplazado hacia abajo en el espacio reservado de caracteres de control (0x0-0x1f). Por ejemplo, Ctrl+@ (0x40) se convierte en NUL (0x00), Ctrl+[ (0x5b) se convierte en ESC (0x1b), etc. Algunas combinaciones de teclas Ctrl se tratan especialmente según la tabla siguiente:
| Clave | Secuencia |
|---|---|
| Ctrl + Espacio | 0x00 (NUL) |
| Ctrl + Flecha arriba | ESC [ 1 ; 5 A |
| Ctrl + Flecha abajo | ESC [ 1 ; 5 B |
| Ctrl + Flecha derecha | ESC [ 1 ; 5 C |
| Ctrl + Flecha izquierda | ESC [ 1 ; 5 D |
Nota:
Ctrl a la izquierda + Alt derecho se trata como AltGr. Cuando ambos se vean juntos, se quitarán y el valor Unicode del carácter presentado por el sistema se pasará al destino. El sistema traducirá previamente los valores AltGr según la configuración actual de entrada del sistema.
Muestras
Ejemplo de secuencias de terminales SGR
El código siguiente proporciona varios ejemplos de formato de texto.
#include <stdio.h>
#include <wchar.h>
#include <windows.h>
int main()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return GetLastError();
}
DWORD dwMode = 0;
if (!GetConsoleMode(hOut, &dwMode))
{
return GetLastError();
}
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOut, dwMode))
{
return GetLastError();
}
// Try some Set Graphics Rendition (SGR) terminal escape sequences
wprintf(L"\x1b[31mThis text has a red foreground using SGR.31.\r\n");
wprintf(L"\x1b[1mThis text has a bright (bold) red foreground using SGR.1 to affect the previous color setting.\r\n");
wprintf(L"\x1b[mThis text has returned to default colors using SGR.0 implicitly.\r\n");
wprintf(L"\x1b[34;46mThis text shows the foreground and background change at the same time.\r\n");
wprintf(L"\x1b[0mThis text has returned to default colors using SGR.0 explicitly.\r\n");
wprintf(L"\x1b[31;32;33;34;35;36;101;102;103;104;105;106;107mThis text attempts to apply many colors in the same command. Note the colors are applied from left to right so only the right-most option of foreground cyan (SGR.36) and background bright white (SGR.107) is effective.\r\n");
wprintf(L"\x1b[39mThis text has restored the foreground color only.\r\n");
wprintf(L"\x1b[49mThis text has restored the background color only.\r\n");
return 0;
}
Nota:
En el ejemplo anterior, la cadena '\x1b[31m' es la implementación de ESC [ <n> m con <n> siendo 31.
En el gráfico siguiente se muestra la salida del ejemplo de código anterior.
Ejemplo de habilitación del procesamiento de terminal virtual
El código siguiente proporciona un ejemplo de la manera recomendada de habilitar el procesamiento de terminal virtual para una aplicación. La intención del ejemplo es demostrar lo siguiente:
El modo existente siempre debe recuperarse a través de GetConsoleMode y analizarse antes de establecerse con SetConsoleMode.
Comprobar si SetConsoleMode devuelve
0y GetLastError devuelve ERROR_INVALID_PARAMETER es el mecanismo actual para determinar cuándo se ejecuta en un sistema de nivel inferior. Una aplicación que recibe ERROR_INVALID_PARAMETER con una de las marcas de modo de consola más recientes en el campo de bits debe degradar correctamente el comportamiento e intentarlo de nuevo.
#include <stdio.h>
#include <wchar.h>
#include <windows.h>
int main()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return false;
}
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
if (hIn == INVALID_HANDLE_VALUE)
{
return false;
}
DWORD dwOriginalOutMode = 0;
DWORD dwOriginalInMode = 0;
if (!GetConsoleMode(hOut, &dwOriginalOutMode))
{
return false;
}
if (!GetConsoleMode(hIn, &dwOriginalInMode))
{
return false;
}
DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;
DWORD dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
if (!SetConsoleMode(hOut, dwOutMode))
{
// we failed to set both modes, try to step down mode gracefully.
dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
if (!SetConsoleMode(hOut, dwOutMode))
{
// Failed to set any VT mode, can't do anything here.
return -1;
}
}
DWORD dwInMode = dwOriginalInMode | dwRequestedInModes;
if (!SetConsoleMode(hIn, dwInMode))
{
// Failed to set VT input mode, can't do anything here.
return -1;
}
return 0;
}
Ejemplo de seleccionar características de actualización de aniversario
El ejemplo siguiente está pensado para ser un ejemplo más sólido de código mediante una variedad de secuencias de escape para manipular el búfer, con énfasis en las características agregadas en la Actualización de aniversario para Windows 10.
En este ejemplo se usa el búfer de pantalla alternativo, la manipulación de tabulaciones, el establecimiento de márgenes de desplazamiento y el cambio del juego de caracteres.
// System headers
#include <windows.h>
// Standard library C-style
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>
#define ESC "\x1b"
#define CSI "\x1b["
bool EnableVTMode()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return false;
}
DWORD dwMode = 0;
if (!GetConsoleMode(hOut, &dwMode))
{
return false;
}
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOut, dwMode))
{
return false;
}
return true;
}
void PrintVerticalBorder()
{
printf(ESC "(0"); // Enter Line drawing mode
printf(CSI "104;93m"); // bright yellow on bright blue
printf("x"); // in line drawing mode, \x78 -> \u2502 "Vertical Bar"
printf(CSI "0m"); // restore color
printf(ESC "(B"); // exit line drawing mode
}
void PrintHorizontalBorder(COORD const Size, bool fIsTop)
{
printf(ESC "(0"); // Enter Line drawing mode
printf(CSI "104;93m"); // Make the border bright yellow on bright blue
printf(fIsTop ? "l" : "m"); // print left corner
for (int i = 1; i < Size.X - 1; i++)
printf("q"); // in line drawing mode, \x71 -> \u2500 "HORIZONTAL SCAN LINE-5"
printf(fIsTop ? "k" : "j"); // print right corner
printf(CSI "0m");
printf(ESC "(B"); // exit line drawing mode
}
void PrintStatusLine(const char* const pszMessage, COORD const Size)
{
printf(CSI "%d;1H", Size.Y);
printf(CSI "K"); // clear the line
printf(pszMessage);
}
int __cdecl wmain(int argc, WCHAR* argv[])
{
argc; // unused
argv; // unused
//First, enable VT mode
bool fSuccess = EnableVTMode();
if (!fSuccess)
{
printf("Unable to enter VT processing mode. Quitting.\n");
return -1;
}
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
printf("Couldn't get the console handle. Quitting.\n");
return -1;
}
CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
GetConsoleScreenBufferInfo(hOut, &ScreenBufferInfo);
COORD Size;
Size.X = ScreenBufferInfo.srWindow.Right - ScreenBufferInfo.srWindow.Left + 1;
Size.Y = ScreenBufferInfo.srWindow.Bottom - ScreenBufferInfo.srWindow.Top + 1;
// Enter the alternate buffer
printf(CSI "?1049h");
// Clear screen, tab stops, set, stop at columns 16, 32
printf(CSI "1;1H");
printf(CSI "2J"); // Clear screen
int iNumTabStops = 4; // (0, 20, 40, width)
printf(CSI "3g"); // clear all tab stops
printf(CSI "1;20H"); // Move to column 20
printf(ESC "H"); // set a tab stop
printf(CSI "1;40H"); // Move to column 40
printf(ESC "H"); // set a tab stop
// Set scrolling margins to 3, h-2
printf(CSI "3;%dr", Size.Y - 2);
int iNumLines = Size.Y - 4;
printf(CSI "1;1H");
printf(CSI "102;30m");
printf("Windows 10 Anniversary Update - VT Example");
printf(CSI "0m");
// Print a top border - Yellow
printf(CSI "2;1H");
PrintHorizontalBorder(Size, true);
// // Print a bottom border
printf(CSI "%d;1H", Size.Y - 1);
PrintHorizontalBorder(Size, false);
wchar_t wch;
// draw columns
printf(CSI "3;1H");
int line = 0;
for (line = 0; line < iNumLines * iNumTabStops; line++)
{
PrintVerticalBorder();
if (line + 1 != iNumLines * iNumTabStops) // don't advance to next line if this is the last line
printf("\t"); // advance to next tab stop
}
PrintStatusLine("Press any key to see text printed between tab stops.", Size);
wch = _getwch();
// Fill columns with output
printf(CSI "3;1H");
for (line = 0; line < iNumLines; line++)
{
int tab = 0;
for (tab = 0; tab < iNumTabStops - 1; tab++)
{
PrintVerticalBorder();
printf("line=%d", line);
printf("\t"); // advance to next tab stop
}
PrintVerticalBorder();// print border at right side
if (line + 1 != iNumLines)
printf("\t"); // advance to next tab stop, (on the next line)
}
PrintStatusLine("Press any key to demonstrate scroll margins", Size);
wch = _getwch();
printf(CSI "3;1H");
for (line = 0; line < iNumLines * 2; line++)
{
printf(CSI "K"); // clear the line
int tab = 0;
for (tab = 0; tab < iNumTabStops - 1; tab++)
{
PrintVerticalBorder();
printf("line=%d", line);
printf("\t"); // advance to next tab stop
}
PrintVerticalBorder(); // print border at right side
if (line + 1 != iNumLines * 2)
{
printf("\n"); //Advance to next line. If we're at the bottom of the margins, the text will scroll.
printf("\r"); //return to first col in buffer
}
}
PrintStatusLine("Press any key to exit", Size);
wch = _getwch();
// Exit the alternate buffer
printf(CSI "?1049l");
}