O que exatamente é o buffer de rolagem e scrollback?

23

O que são "scrollback" e "scrollback buffer" em programas como bashe screen, e como eles se relacionam com o tty, os programas sendo executados e stdin / stdout / stderr?

Aqui está a única definição de "scrollback" que encontrei até agora (no wiki do archlinux ):

A rolagem é uma função implementada em um console de texto para permitir que o usuário volte para exibir as linhas de texto que rolaram para fora da tela. Isso é possível por um buffer criado apenas para esse fim entre o adaptador de vídeo e o dispositivo de exibição; o buffer de rolagem.

Mas, isso levanta mais perguntas para mim:

  • Significa "função" como em "sub-rotina" ou como em "recurso"?
  • Existe um padrão Unix ou API para esse buffer de rolagem?
  • Em uma "pilha" de programas, como viminiciados em screeniniciados bashem sshiniciados em um emulador de terminal, quais desses programas estão controlando o buffer de rolagem?

Eu também usado screenpara despejar o scrollback para um arquivo . Esse arquivo tinha muito espaço em branco na parte superior e parece que a "visualização" do meu emulador de terminal mostra apenas as poucas linhas inferiores do buffer.

  • É por isso que um programa como vimpode "limpar" toda a janela do terminal, porque obtém acesso temporário ao buffer de rolagem do shell pai?
  • Ou vimusa seu próprio buffer de rolagem que é de alguma forma sobreposto ao buffer de rolagem pai?
Oleg
fonte

Respostas:

28

Essa é uma pergunta um pouco complicada. Tentarei responder às suas perguntas, mas primeiro uma descrição geral:

O buffer de rolagem é implementado pelo emulador de terminal ( xterm, Konsole, GNOME Terminal). Ele contém todo o texto exibido na tela, incluindo a saída padrão e o erro padrão de todos os programas executados no terminal. É uma funcionalidade inteiramente terminal para permitir que você analise a saída anterior que pode ter passado por você ou verifique o que algo disse anteriormente.

Você pode pensar no buffer de rolagem como uma longa página de saída registrada e na janela do terminal como uma janela que olha apenas parte dela a qualquer momento. Se você não rolou nenhum, o que você está vendo é o final do buffer. Normalmente, haverá um limite configurado no terminal de quantas linhas ele rastreia antes de começar a esquecer.

Suponha que o limite seja de 1000 linhas. Nas primeiras mil linhas de saída da sua sessão, basta anexar ao buffer e você pode rolar para a direita até o início da sua sessão. Assim que a 1001ª linha de saída for apagada, a primeira linha do buffer será apagada e a parte mais traseira que você pode rolar será a segunda linha da sua sessão. O buffer sempre conterá as mil linhas de saída mais recentes exibidas na tela e você pode rolar para cima para ver a saída anterior a qualquer momento.

  • Significa "função" como em "sub-rotina" ou como em "recurso"?

    Isso é "função", como em "recurso". O emulador de terminal possui uma funcionalidade que registra o que está na tela e permite rolar para cima e para baixo nela. Os consoles em alguns sistemas também oferecem suporte a rolagem limitada.

    Fica um pouco mais complicado quando você joga screenna mistura. Nesse ponto, screenestá emulando o próprio buffer de rolagem - é por isso que você pode copiar e colar dele dentro do programa, em vez de apenas com (digamos) seleção X.

  • Existe um padrão Unix ou API para esse buffer de rolagem?

    A resposta curta é não, é apenas fornecida pelo seu terminal. Quanto maior a resposta, chegaremos na parte inferior.

  • Em uma "pilha" de programas, como o vim, lançado na tela lançada no bash, lançada no ssh, lançada em um emulador de terminal, quais desses programas estão controlando o buffer de rolagem?

    No caso de vime bash, eles não estão controlando nada (ressalva, novamente, abaixo). Seu terminal fornece o buffer de rolagem para todos os programas dentro dele, a partir do seu shell. screen, como mencionado acima, está simulando o próprio scrollback.

  • Eu também usei a tela para despejar a rolagem para um arquivo. Esse arquivo tinha muito espaço em branco na parte superior e parece que a "visualização" do meu emulador de terminal mostra apenas as poucas linhas inferiores do buffer.

    Este é screeno buffer interno. O que está em sua tela no momento geralmente é o que está na parte inferior do buffer.

  • É por isso que um programa como o vim pode "limpar" minha janela de terminal inteira, porque obtém acesso temporário ao buffer de rolagem do shell pai?

    Aqui está uma parte de onde fica muito mais complexo. Praticamente todos os emuladores de terminal baseados em X estão simulando um VT100, e uma coisa que eles fazem lá é oferecer suporte a um "Buffer de Tela Alternativo" . Diferente do buffer comum usado para a maioria das interações do terminal com saída sequencial, o buffer de tela alternativo tem exatamente o tamanho exato do seu terminal. Não há rolagem para cima ou para baixo, porque não é maior que o que é exibido.

    A idéia é permitir que um aplicativo em tela cheia faça o que precisa sem ser interferido por tudo o que você já tinha na tela e, em seguida, permita que você volte exatamente à exibição que tinha antes. É por isso que, quando você entra vim, preenche a tela inteira, mas quando você o deixa, a saída do terminal que você tinha anteriormente - todos os seus prompts anteriores e saída de comando - volta novamente. vimalterna para o buffer de tela alternativo quando é iniciado e volta para o buffer normal quando sai.

    Esse buffer alternativo é uma das ressalvas que mencionei acima. Às vezes, o programa realmente tem a capacidade de dizer ao terminal o que fazer com o buffer.

    screené outro programa que faz isso, e é por isso que a funcionalidade de rolagem do seu terminal geralmente não funciona enquanto você está em uma sessão de tela -  screenemula o próprio buffer de rolagem, então você precisa usar sua funcionalidade interna para obter a saída antiga.

  • Ou o vim usa seu próprio buffer de rolagem que, de alguma forma, é sobreposto ao buffer de rolagem pai?

    Eu respondi isso principalmente na pergunta anterior, mas a resposta curta para essa pergunta em particular é que vimela obtém seu próprio buffer temporário, sem retorno de rolagem, do terminal e, em seguida, executa toda a sua própria rolagem de seus documentos internamente.

Todas essas exceções que mencionei:

Fica um pouco mais complicado novamente. Eu disse que os aplicativos não têm controle sobre o scrollback e que ele é fornecido inteiramente pelo terminal. Em alguns casos, com alguns terminais, a interação é limitada. O programa imprime certas seqüências de escape - se você já usou a coloração do terminal manualmente no passado, já viu como elas são - e o terminal pode interpretá-las e mudar seu comportamento, ou até mesmo enviar informações ao programa. Quais seqüências de escape estão disponíveis são descritas no banco de dados termcap (capacidade do terminal) .

Alguns terminais oferecem suporte a consultas e manipulação limitadas do buffer de rolagem. Muitos xtermderivativos têm seqüências de escape que direcionam o terminal para rolar sua visualização. Muitos terminais também suportam a especificação de uma área específica da tela a ser rolada, deixando todo o resto intacto. Isso tende a quebrar o buffer de rolagem.

Quase todos os terminais suportam sequências para mover o cursor pela tela, e é assim que a ncursesbiblioteca é capaz de atualizar todas as partes diferentes da tela. Você pode ver as sequênciasxterm do VT100 suportadas por . A maneira como elas interagem com o buffer de rolagem pode ser um pouco estranha às vezes, principalmente no caso de algo que implementa seu próprio comportamento de rolagem, como o lesscomando Você pode acabar com linhas duplicadas ou ausentes no seu scrollback, porque lessredirecionou o texto por cima de uma maneira que o seu terminal não esperava. Outros programas às vezes acabam preenchendo seu buffer com várias cópias de toda a tela.

Michael Homer
fonte
1
Muito obrigado por esta ótima resposta! É muito completo e fácil de entender, apesar do tópico complexo. Os detalhes extras me fazem querer aprender mais e me mostram onde procurar.
Oleg
1
Alguns terminais têm uma opção para scrollback ilimitado, isso significa que o scrollback inteiro é RAM (então, em algum momento, ocorreremos uma falha de malloc ou OOM no terminal) ou tentar gravar no disco e carregar do disco à medida que você rolagem? Como programas de bate-papo.
precisa saber é o seguinte
As seqüências de escape para consulta geralmente não estão no termcap (nem no terminfo, o que seria mais completo).
Thomas Dickey
O @CMCDragonkai Konsole mantém um scrollback finito na memória, mas coloca um scrollback infinito no disco não criptografado; você é avisado sobre isso na caixa de diálogo de configurações. O VTE (gnome-terminal e outros) armazena a rolagem (finita ou infinita) no disco, compactada e criptografada. Não sei o que outros emuladores fazem.
Egmont