Qual é a API gráfica do terminal?

8

Como certos programas podem definir cores de fundo e de fonte, gravar caracteres no mesmo local na tela (por exemplo, na terceira linha, quinta coluna) mais de uma vez?

Alguns exemplos são a barra de progresso exibida por curl google.com > a, algumas telas de instalação e praticamente qualquer editor de texto.

vemv
fonte

Respostas:

5

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 da época eram máquinas Teletype . Basicamente, uma máquina de escrever com papel alimentado por faixa conectado ao computador com uma conexão serial. Digitar um caractere enviaria esse valor binário para o computador (e também na página). O computador imprimiria caracteres de volta como a saída do que você solicitasse.

Caracteres especiais foram usados ​​para controlar o terminal (que é a origem da chave de controle, era para produzir esses caracteres). Por exemplo, ^Hou ^?seria um backspace, ^Mé um retorno de carro (move o cursor para o início da linha) e ^Jé um avanço de linha (mova a página uma linha acima). 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 seria \b, \r, \nrespectivamente.

O emulador de terminal que você usa hoje é exatamente o que parece, é um software que está fingindo ser uma máquina de teletipo antiga. De certa forma, é quase como se o Unix ainda pensasse que você está usando uma máquina de escrever para se comunicar com ela.

No caso de curl, ele grava uma linha inteira e envia \r(retorno de carro) levando o cursor para o início da linha e, em seguida, grava outra linha. Como um feed de linha não é enviado, ele continua escrevendo sobre a mesma linha na tela.

Aqui está algo que você pode tentar demonstrar:

echo -n  "First" ; sleep 5 ; echo -en "\rSecond\n"

Você verá a palavra "Primeira" impressa (mas nenhuma nova linha será enviada). 5 segundos depois, ele será substituído pela palavra "Segundo" e uma nova linha será enviada. Você pode repetir esse padrão indefinidamente. Tente adicionar "Terceiro", você verá algo que provavelmente não esperava ;-)

Para obter mais informações sobre esses e outros caracteres de controle, consulte o ascii(7)manual.

bahamat
fonte
7

Você está procurando algo como ncurses ?

Boris Ivanov
fonte
3
Hoje em dia, você vai querer as novas maldições, ou ncurses.
Monday Steven
Exatamente. Obrigado pelas correções. Eu esqueci que eles eram diferentes.
Boris Ivanov
1

Essa pergunta é na verdade várias perguntas, e "caracteres de controle" aborda apenas uma pequena parte dela, por exemplo, a barra de progresso para curl. De maneira mais geral, esses são recursos comuns dos terminais (e emuladores de terminal).

A maioria desses recursos comuns é padronizada no ECMA-48: Funções de controle para conjuntos de caracteres codificados . No entanto, outros recursos não são . Eles são definidos pela implementação.

O ECMA-48 refere-se às funções de controle . Isso inclui caracteres de controle e seqüências de controle (geralmente chamadas de seqüências de escape, sequências ANSI, etc.).

Alguns caracteres de controle são usados ​​para operações simples , por exemplo,

  • mova o cursor para a coluna anterior na mesma linha
  • mova o cursor para a primeira coluna na mesma linha
  • mova o cursor para a próxima tabulação na mesma linha
  • mova o cursor para a próxima linha (e role a tela seestiver na última linha)

A barra de progresso para curlé construída usando essas operações simples. Mas os personagens de controle podem fazer muito, não mais. Seqüências de controle fazem mais, por exemplo,

  • mova o cursor para qualquer linha / coluna na tela
  • mova o cursor para qualquer linha da mesma coluna na tela
  • mova o cursor para qualquer coluna na mesma linha da tela
  • definir paradas de tabulação em qualquer coluna na tela
  • mova o cursor para a linha anterior
  • faça a tela rolar para cima ou para baixo sem mover o cursor

Tanta coisa para paralelos entre simples / complexo. As seqüências de controle também são usadas para alterar a cor do texto e do plano de fundo, apagar o texto da tela, mostrar o texto em vídeo reverso (ou negrito, sublinhado, piscar).

Programas que desenham uma barra de progresso de vídeo reverso (ou colorido) usam seqüências de controle .

Embora as seqüências de controle possam fazer mais, elas podem fazer apenas 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 é simplificada usando bibliotecas que conhecem essas coisas. Inicialmente, tínhamos termcap (e um banco de dados de algumas centenas de tipos de terminal), estendido para terminfo (e um banco de dados de cerca de mil tipos de terminal).

Mesmo com a padronização, existem dezenas de descrições de terminal que você pode usar . Portanto, continuamos a usar bibliotecas para todos, exceto o mais trivial desses aplicativos. Um é ncurses ("novas maldições"), outro é uma gíria (tecnicamente "S-Lang").

Leitura adicional:

Thomas Dickey
fonte