Códigos de Escape VT100 e Cores ANSI
Agora que compreendemos que o caractere ESC (27, 0x1B) é a chave para sequências especiais, podemos avançar para o padrão que transformou o terminal em uma interface programável: o padrão VT100, originalmente implementado pela VT100 da Digital Equipment Corporation.
Hoje, praticamente todos os terminais modernos (Linux console, macOS Terminal, Windows Terminal, PuTTY, etc.) suportam as chamadas ANSI escape sequences, derivadas desse padrão.
1. Estrutura de uma Sequência ANSI
Toda sequência começa com:
ESC [
Ou, em C:
"\x1B["
Ou ainda:
"\033["
(033 em octal equivale a 27 decimal)
Depois disso vêm parâmetros e um caractere final que define a ação.
Formato geral:
ESC [ parâmetros comando
Exemplo:
ESC [ 31m
Que significa:
→ Definir cor do texto para vermelho.
2. Cores ANSI Básicas
Cores do texto (foreground)
| Código | Cor |
|---|---|
| 30 | Preto |
| 31 | Vermelho |
| 32 | Verde |
| 33 | Amarelo |
| 34 | Azul |
| 35 | Magenta |
| 36 | Ciano |
| 37 | Branco |
Para aplicar:
ESC[31m
Para resetar:
ESC[0m
Exemplo prático em C
#include <stdio.h>
#define RED "\x1B[31m"
#define GREEN "\x1B[32m"
#define YELLOW "\x1B[33m"
#define RESET "\x1B[0m"
int main() {
printf(RED "ERRO: Falha na comunicação\n" RESET);
printf(GREEN "OK: Sistema operacional\n" RESET);
printf(YELLOW "ALERTA: Temperatura elevada\n" RESET);
return 0;
}
Saída no terminal:
- ERRO em vermelho
- OK em verde
- ALERTA em amarelo
Isso já eleva o nível profissional do log.
3. Cores de Fundo
Para fundo:
| Código | Cor |
|---|---|
| 40 | Preto |
| 41 | Vermelho |
| 42 | Verde |
| 43 | Amarelo |
| 44 | Azul |
| 45 | Magenta |
| 46 | Ciano |
| 47 | Branco |
Exemplo:
printf("\x1B[30;43mALERTA CRÍTICO\x1B[0m\n");
Texto preto sobre fundo amarelo.
4. Combinação de atributos
Você pode combinar parâmetros separados por ;.
ESC[1;31m
| Código | Significado |
|---|---|
| 0 | Reset |
| 1 | Negrito |
| 4 | Sublinhado |
| 5 | Piscando (nem sempre suportado) |
| 7 | Invertido |
Exemplo:
printf("\x1B[1;31mERRO CRÍTICO\x1B[0m\n");
5. Logs Estruturados Profissionais
Agora vamos criar um log realmente estruturado.
void log_info(const char *msg) {
printf("\x1B[32m[INFO]\x1B[0m %s\n", msg);
}
void log_warn(const char *msg) {
printf("\x1B[33m[WARN]\x1B[0m %s\n", msg);
}
void log_error(const char *msg) {
printf("\x1B[31m[ERROR]\x1B[0m %s\n", msg);
}
Uso:
log_info("Sistema inicializado");
log_warn("Temperatura acima do normal");
log_error("Falha no sensor");
Resultado visual claro e imediato.
Esse tipo de abordagem é extremamente útil em:
- Firmware via UART
- Debug via SWO
- Aplicações CLI Linux
- Scripts DevOps
- Backend Node.js
6. Cores em 256 tons
Terminais modernos suportam 256 cores.
Formato:
ESC[38;5;Xm → texto
ESC[48;5;Xm → fundo
Exemplo:
printf("\x1B[38;5;202mTexto Laranja Customizado\x1B[0m\n");
Isso permite criar dashboards mais sofisticados.
7. Controle de Cursor
Além de cores, VT100 permite controlar posição.
| Código | Função |
|---|---|
| ESC[2J | Limpa tela |
| ESC[H | Cursor para topo |
| ESC[row;colH | Posiciona cursor |
| ESC[K | Limpa linha |
Exemplo:
printf("\x1B[2J"); // limpa tela
printf("\x1B[H"); // topo
printf("Painel do Sistema\n");
Isso permite criar interfaces pseudo-gráficas.