Como é implementada a GUI do Vim se for um programa que roda em terminal?

Como é implementada a GUI do Vim se for um programa que roda em terminal?

Não consigo entender como são implementados programas como o Vim (ou top por exemplo) que são executados dentro do terminal e possuem uma GUI. Supõe-se que o terminal só pode exibir caracteres, e o Vim pode não apenas mostrar múltiplas janelas, mas também pode manipular o cursor movendo-o em todas as direções.

Outro exemplo é o Linuxprincipalutilitário que mostra informações emtempo realque está atualizado, como é possível que este programa possa atualizar as informações em vez de fazer umarolar para baixoe mostrando novos personagens impressos?.

Responder1

Os aplicativos executados em um terminal podem ter umtextointerface do usuário porque a maioria dos terminais não são apenasterminais burrosque só podem imprimir caracteres e passar para a próxima linha, mas terminais “inteligentes” que suportampersonagens de controleesequências de escapecom significados como “apagar a linha atual e rolar as linhas subsequentes para cima”, “mover para a posição (53,7)””, “de agora em diante imprimir em vermelho brilhante”, etc.

A maioria dos emuladores de terminal implementa a maior parte dossequências de escape de xterm, em sua maioria compatível com oVT100terminal de hardware e seus sucessores. Os aplicativos sabem quais sequências de escape enviar para executar diversas ações por meio dotermcapouinformações do termobancos de dados. VerComo funcionam a entrada do teclado e a saída de texto?(seção “Aplicativo em modo texto, rodando em um terminal”) eComo e onde $TERM é interpretado?para mais detalhes.

Além de ter uma interface de usuário de texto, o Vim também possui uma interface gráfica de usuário chamada GVim. Esta interface é executada em um terminal gráfico que implementa oProtocolo X11, não em um terminal de texto (mas é claro que você podelançaro aplicativo de dentro de um terminal de texto, ele simplesmente não será exibido nesse terminal).

Responder2

vime gvimpodem ser executáveis ​​separados, vinculados a bibliotecas diferentes. É possível ter um executável executando qualquer uma das interfaces (elvis e emacs fazem isso, por exemplo). O vim 4.0 em 1996 adicionou uma -gopção para instruí-lo a usar a versão GUI (que neste caso faria parte do mesmo executável).

Não encontrei uma cópia do anúncio do 4.0 (o que pode ter dado algumas pistas sobre a motivação para a -gopção (a lista de discussão de anúncios do vim começou em1997), mas veja-o mencionado em um antigo FAQ de Laurent Duperval:

7.3 How can I make Vim faster on a Unix station?

   The GUI support in Vim 4.0 can slow down the startup time noticeably.
   Until Vim supports dynamic loading, you can speed up the startup time
   by compiling two different versions of Vim: one with the GUI and one
   without the GUI and install both. Make sure you remove the link from
   $bindir/gvim to $bindir/vim when installing the GUI version, though.

   If screen updating is your problem, you can run Vim in screen. screen
   is an ascii terminal multiplexer. The latest version can be found at
   <URL:ftp://ftp.uni-erlangen.de:/pub/utilities/screen>.

Lembro-me que por um bom tempo existiam dois executáveis ​​(quandoquealterado exigiria muita pesquisa sobre os pacotes reais usados). Mas a capacidade existia desde 1996.

Dado qualquer tipo de interface, existem maneiras de atualizar a exibição. Para gvim, isso usa as bibliotecas X, enquanto aplicativos de terminal como top(ouvim) use sequências de escape. Dependendo do sistema, ambos sãotermcapformuláriostop, obtendo seu repertório de sequências de escape usando a interface termcap de ncurses, etc.usarncurses para exibição, por exemplo, htop). O vim aumenta esse repertório usando tabelas internas (que geralmente são redundantes).

Curiosamente, a procpsversão do topno Debian é (uma relativa raridade) uminformações do termoaplicação, como pode ser visto inspecionando seuCódigo fonte.

Responder3

Após o TTY original, foram disponibilizados terminais que substituem a impressora por um VDU.

Um VDU possui características ligeiramente diferentes do papel. Os caracteres no display podem ser apagados e substituídos, e não apenas riscados demais.

ASCII forneceu caracteres de controle suficientes para uma impressora de linha básica, mas não antecipou o VDU. Controles adicionais específicos do terminal são codificados em ASCII usando um "escape". Uma sequência de escape é iniciada com um caractere de escape ASCII. Os caracteres a seguir na sequência são interpretados como controles específicos do terminal.

O editor visual vié um bom exemplo de aplicação que utiliza essa nova tecnologia.

Conjuntos de códigos de escape estão sendo padronizados. Se você tiver documentação recente o suficiente, "ANSI escape" pode ser um bom termo para procurar noíndice.

informação relacionada