Como certos programas podem definir cores de fundo e de fonte, escrever caracteres no mesmo local da tela (por exemplo, na terceira linha, quinta coluna) mais de uma vez?
Alguns exemplos são a barra de progresso exibida pelo curl google.com > a
, algumas telas de instalação e praticamente qualquer editor de texto.
Responder1
O que você está perguntando não é realmente uma API gráfica, são apenas caracteres de controle de terminal.
Há muita história por trás disso, mas os terminais daquela época eramTeletipomáquinas. Basicamente, uma máquina de escrever com papel alimentado conectado ao computador por meio de uma conexão serial. Digitar um caractere enviaria esse valor binário para o computador (e também o digitaria na página). O computador imprimiria caracteres de volta como a saída de tudo o que você solicitou.
Caracteres especiais eram usados para controlar o terminal (de onde vem a chave de controle, era para produzir esses caracteres). Por exemplo, ^H
ou ^?
seria um retrocesso, ^M
é um retorno de carro (move o cursor para o início da linha) e ^J
é um avanço de linha (move a página uma linha para cima). Alguns códigos de controle possuem uma sequência de escape em C (que é compartilhada por quase todas as linguagens de programação) para gerar os caracteres de controle. Os controles listados anteriormente seriam \b
, \r
, \n
respectivamente.
Oemulador de terminalque você usa hoje é exatamente o que parece, é um software que finge ser uma velha máquina de teletipo. De certa forma, é quase como se o Unix ainda pensasse que você está usando uma máquina de escrever para se comunicar com ele.
No caso de curl
, ele escreve uma linha inteira e depois envia \r
(retorno de carro) levando o cursor para o início da linha e depois escreve outra linha. Como um feed de linha não é enviado, ele continua escrevendo na mesma linha na tela.
Aqui está algo que você pode tentar demonstrar isso:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
Você verá a palavra “Primeiro” impressa (mas nenhuma nova linha será enviada). 5 segundos depois será substituído pela palavra "Segundo" e uma nova linha será enviada. Você pode repetir esse padrão indefinidamente. Tente adicionar "Terceiro" você mesmo, você verá algo que provavelmente não esperava ;-)
Para mais informações sobre estes e outros caracteres de controle consulte o ascii(7)
manual.
Responder2
Você está procurando algo comomaldições?
Responder3
Essa pergunta é na verdade várias perguntas, e"personagens de controle"aborda apenas uma pequena parte dele, por exemplo, a barra de progresso para curl
. De modo mais geral, esses são recursos comuns de terminais (e emuladores de terminal).
A maioria desses recursos comuns são padronizados emECMA-48: Funções de controle para conjuntos de caracteres codificados. No entanto, outras características sãonão. Eles são definidos pela implementação.
ECMA-48 refere-se afunções de controle. Isso incluipersonagens de controleesequências de controle(muitas vezes referidas como sequências de escape, sequências ANSI, etc.).
Alguns caracteres de controle são usados parasimplesoperações, por exemplo,
- mova o cursor para a coluna anterior na mesma linha
- mova o cursor para a primeira coluna da mesma linha
- mova o cursor para a próxima parada de tabulação na mesma linha
- mova o cursor para a próxima linha (e role a telasejá na última linha)
A barra de progresso curl
é construída usando essas operações simples. Mas os personagens de controle só podem fazer até certo ponto, nada mais. As sequências de controle fazem mais, por exemplo,
- mova o cursor para qualquer linha/coluna da tela
- mova o cursor para qualquer linha na mesma coluna da tela
- mova o cursor para qualquer coluna na mesma linha da tela
- definir paradas de tabulação em qualquer coluna da tela
- mova o cursor para a linha anterior
- fazer a tela rolar para cima ou para baixo sem mover o cursor
Chega de paralelos entre simples/complexo. As sequências de controle também são usadas para alterar a cor do texto e do fundo, apagar texto da tela, mostrar texto em vídeo reverso (ou negrito, sublinhado, piscando).
Programas que desenham uma barra de progresso de vídeo reverso (ou colorido) usamsequências de controle.
Embora as sequências de controle possam fazer mais, elas só podem fazer coisas específicas. Juntá-los para criar editores de texto, telas de instalação (e programas que desenham barras de progresso coloridas) fica complicado. Parte disso é simplificado com o uso de bibliotecas que conhecem essas coisas. Inicialmente, tínhamos o termcap (e um banco de dados com algumas centenas de tipos de terminais), estendido para o terminfo (e um banco de dados com cerca de mil tipos de terminais).
Mesmo com a padronização, existem dezenas de descrições de terminais que você poderiausar. Portanto, continuamos a usar bibliotecas para todas essas aplicações, exceto as mais triviais. Uma é ncurses ("novas maldições"), outra é uma gíria (tecnicamente "S-Lang").
Leitura adicional: