O que é a API gráfica do terminal?

8

Como certos programas podem definir cores de plano de fundo e de fonte, escrever 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.

    
por vemv 05.07.2012 / 09:59

3 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 de volta no dia eram máquinas Teletipo . Basicamente uma máquina de escrever com papel de trilha conectado ao computador com uma conexão serial. Digitar um caractere enviaria esse valor binário para o computador (assim como o digitaria na página). O computador imprimiria os caracteres de volta como a saída do que você solicitou.

Caracteres especiais foram usados para controlar o terminal (que é onde a chave de controle vem, foi 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 (mova a página uma linha). Alguns códigos de controle possuem uma seqüê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.

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

No caso de curl , grava uma linha inteira, em seguida, 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 na 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 "Primeiro" impressa (mas nenhuma nova linha é enviada). 5 segundos depois, ele será substituído pela palavra "Second" e uma nova linha será enviada. Você pode repetir esse padrão indefinidamente. Tente adicionar "Terceiro", você verá algo que você provavelmente não esperava; -)

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

    
por 05.07.2012 / 10:38
7

Você está procurando por algo como ncurses ?

    
por 05.07.2012 / 10:39
1

Essa questão é, na verdade, várias perguntas, e "caracteres de controle" aborda apenas uma pequena parte dela, por exemplo, a barra de progresso de curl . Mais geralmente, essas são características comuns de terminais (e emuladores de terminal).

A maioria desses recursos comuns é padronizada em 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.

ECMA-48 refere-se a funções de controle . Isso inclui caracteres de controle e seqüências de controle (muitas vezes referidas como seqüências de escape, seqüê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 parada de tabulação na mesma linha
  • mova o cursor para a próxima linha (e role a tela se já estiver na última linha)

A barra de progresso para curl é criada usando essas operações simples. Mas os personagens de controle podem fazer tanto, não mais. As sequências de controlo fazem mais, por exemplo,

  • mova o cursor para qualquer linha / coluna na 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 na tela
  • mova o cursor para a linha anterior
  • faz a rolagem da tela para cima ou para baixo sem mover o cursor

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

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

Embora as sequências de controle possam fazer mais, elas podem fazer apenas coisas específicas. Colocá-los juntos para tornar editores de texto, telas de instalação (e programas que desenham barras de progresso coloridas) fica complicado. Parte disso é simplificado usando bibliotecas que conhecem essas coisas. Inicialmente, tínhamos o termcap (e um banco de dados de algumas centenas de tipos de terminal), estendido para o 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 . Então, continuamos a usar bibliotecas para todos, mas o mais trivial desses aplicativos. Um é o ncurses ("new-curses"), o outro é o slang (tecnicamente "S-Lang").

Leitura adicional:

por 18.06.2016 / 21:46