Ultimamente, tenho me perguntado como funciona a interface do usuário do vim, que quando você o inicia, ele ocupa toda a janela do terminal, em vez de apenas imprimir texto e talvez exigir que você insira algo e, quando terminar, imprima outra linha de comando abaixo.
Como isso funciona, só por curiosidade?
A janela do terminal é simplesmente uma emulação de um " terminal burro - Wikipedia " que não pode fazer nada além de exibir linhas de caracteres, tradicionalmente 24 linhas de 80 caracteres ASCII, com novos caracteres sendo adicionados apenas no final da última linha. (Pense em uma máquina de escrever.)
Os terminais gradualmente ficaram "mais inteligentes", adicionando a capacidade de mover o cursor para um local específico, inserir linhas, exibir o próximo caractere em cores, etc.
Mas cada fabricante fazia isso à sua maneira e não havia um padrão único, portanto, cada programa teria incorporado o conhecimento do hardware específico com o qual estava sendo usado. (Lembro-me de ter visto um programa de interface de banco de dados em uma feira no início dos anos 1980. O apresentador deu uma lista de cerca de uma dúzia de tipos de terminais comuns com os quais ele sabia como trabalhar e disse que por apenas $ X eles poderiam ensiná-lo para lidar com qualquer outro tipo que tivéssemos em nossa empresa.)
Enquanto isso, a BSD desenvolveu a biblioteca Termcap - Wikipedia para seu sistema UNIX. Ele especificou um banco de dados baseado em texto que definiu um conjunto de recursos padrão para cada tipo de terminal e forneceu uma biblioteca C que usou esse banco de dados para determinar o formato apropriado da string a ser enviada ao terminal com base na
TERM
variável de ambiente. Nem todos os terminais suportam todos os recursos, é claro, mas tudo bem, os programas saberiam usar apenas os recursos disponíveis (por exemplo, se um terminal não tivesse endereçamento direto, ele poderia subir/descer uma linha e mover para a esquerda/ uma posição direita).termcap.small · freebsd/freebsd · O GitHub mostra um exemplo de entrada termcap para um terminal vt100:
Mais tarde, uma biblioteca curses - Wikipedia foi desenvolvida para simplificar o processo, fornecendo funções para gerar os códigos apropriados com valores especificados. Qualquer programa poderia simplesmente dizer algo como
tgoto(capabilities, column, row)
, e a biblioteca encontraria o tipo de terminal naTERM
variável de ambiente, procuraria os recursos para esse tipo específico no banco de dados termcap e geraria uma string contendo os comandos de terminal apropriados para mover o cursor para o especificado posição.termcap(3) - As páginas de manual do OpenBSD mostram declarações de algumas funções libcurses:
Programas, como o vi-Wikipedia , usavam essas bibliotecas para fornecer um editor que funcionaria em qualquer terminal com uma tela endereçável. Um novo tipo de terminal exigia apenas a definição de sua entrada termcap e funcionaria automática e instantaneamente com
vi
qualquer outro programa baseado nessa biblioteca.Eventualmente
termcap
foi substituído por uma versão melhorada chamadaterminfo
, ecurses
foi substituído por uma nova versãoncurses
, mas os princípios subjacentes permaneceram os mesmos.Observe que tudo isso depende da capacidade do UNIX de ler um caractere inserido no teclado sem exibi-lo automaticamente no terminal. Muitos sistemas operacionais da época não podiam fazer isso. Alguns nem mesmo aceitariam a entrada do terminal até que uma linha inteira (ou até mesmo a tela) fosse inserida.
Programas com uma interface de usuário textual (TUI) em tela cheia em sistemas operacionais do tipo Unix usam uma biblioteca de posicionamento de cursor chamada
curses
.Esta biblioteca inicialmente usou um banco de dados de capacidades de terminal conhecido como
termcap
que foi posteriormente substituído por um sistema conhecido comoterminfo
.Os aplicativos TUI exibidos em uma área de trabalho GUI fazem uso de sinais de redimensionamento de janela, como
sigwinch