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 screen
na mistura. Nesse ponto, screen
está 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 vim
e 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 é screen
o 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. vim
alterna 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 - screen
emula 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 vim
ela 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 xterm
derivativos 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 ncurses
biblioteca é 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 less
comando Você pode acabar com linhas duplicadas ou ausentes no seu scrollback, porque less
redirecionou 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.