O comportamento estranho do comando Bash clear exclui o buffer de rolagem.

O comportamento estranho do comando Bash clear exclui o buffer de rolagem.

Sempre que executo clear em meu terminal, ele exclui o buffer de rolagem do topo da tela para a linha atual. Eu tentei em xterm, st e urxvt, e o problema permanece. Existe alguma maneira de alterar o comportamento de clear para que ele não toque no buffer de rolagem?

Responder1

O comentário "do topo da tela até a linha atual" é ambíguo. Se você quis dizer do topo doparte visívelda tela, esse não é oretroceder. O scrollback de um terminal é a parte que você pode ver apenas usando a barra de rolagem (ou teclas adequadas, como shift pageup).

Sequências de controle XTermdocumenta a sequência de escape relevante:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).

A capacidade de descrição do terminal clearusa o penúltimo, por exemplo,

clear=\E[H\E[2J

para posicionar o cursor no canto superior esquerdo e depois limpar toda a tela (visível). Vocêpoderiause oApagar abaixo, mas isso não é usado na descrição do terminal.

Referindo-se à limpeza doretroceder: Esse é um recurso específico do terminal, originalmente uma sequência de escape em xterm (1999, documentado emctlseqs.msmas não mencionado nas alterações) e posteriormente (2011) implementado como uma extensão para o console Linux e a descrição do terminal correspondente. O banco de dados do terminal o lista como um"extensão diversa".

Atualmente, essas descrições de terminal possuem o recurso:

Se é suportado em similares ao xterm, como o VTE, teria que ser respondido através de testes (não há documentação útil para o VTE ou o Konsole).

Se preferir não usar a extensão, você pode remover oE3capacidade da descrição do terminal que você usa, por exemplo,

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo

Eu sugeri usar as opções-1e-xpara simplificar a formatação e mostrar o recurso a ser alterado. O exemplo dado emhttps://ghostbin.com/paste/kfsbjé consistente com esse conselho:

  • o nome do caminho /home/flowerpick/.terminfo/x/xtermseria usado por ncurses
  • os recursos AXe XTsão recursos estendidos (como E3), mostrados com a -xopção.

Se você estiver usando mais de um tipo de terminal, terá que fazer isso para cada um (valor de $TERM), e a alteração se aplica apenas à máquina onde você executa o clear. As primeiras linhas da infocmpsaída mostram em qual você está trabalhando:

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),

Por exemplo, uxrvtdefine $TERMalgo como rxvt-unicode, produzindo linhas como esta em infocmp:

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),

O stprograma usa xterm(ou possivelmente xterm-256color), embora já faça um tempo desde que vi uma cópia doqueque funcionou bem o suficiente para comentar.

A propósito, vocêpoderiatenho um alias para clearo qual está enviando a sequência de escape fornecida (ignorando a descrição do terminal), mas não vi isso relatado por ninguém.

Se você quiser "limpar acima", não é tão simples quanto digitar "limpar". O escape \033[1Japaga do canto superior esquerdo até a posição atual do cursor. Você poderia fazer um script que faça isso, para limpar apenas olinhasacima do cursor atual:

  • use o relatório de posição do cursor para encontrar a linha/coluna em que o cursor está atualmente e
  • se o cursor não estiver na primeira linha, (salvando essa posição), mova o cursor uma linha para cima e então (com a hpasequência) movacertoum grande número,
  • emitir o "claro acima" e
  • retornar à posição original usando cup(endereçamento do cursor).

Essa parte do relatório de posição do cursor não parece funcionar (por exemplo) em uma ligação readline, então sugeri um script. Você poderia fazer uma ligação que usasse os recursos de salvamento/restauração do cursor se não houvesse o problema de estar na primeira linha.

Responder2

Eu tive o mesmo problema e adicionar um alias .bashrcajudou:

alias clear='printf "\E[H\E[2J"'

Lembrete: as alterações .bashrcentrarão em vigor após você abrir um novo terminal!

Responder3

Eu costumo usar rotineiramente clearpara que meu prompt de comando vá para o topo da tela e apague inadvertidamente o buffer de rolagem, geralmente com conteúdo importante, como mensagens de erro úteis de operações anteriores.

Verificando a página de manual, ela afirma claramente:

clear limpa sua tela se isso for possível, incluindo seu buffer de rolagem (se a capacidade “E3” estendida estiver definida).

Também existe uma opção lá:

-x não tenta limpar o buffer de rolagem do terminal usando o recurso “E3” estendido.

Desde então, adicionei isso à minha lista de aliases em ~/.bashrc:

alias clear='clear -x'

Ainda recebo a solicitação para ir para o topo quando executo clear, mas agora posso rolar para trás, se quiser.

Responder4

Minha solução para isso é adicionar o seguinte alias ao meu.bashrc

alias clear='tput reset'

Caso alguém queira usar o comportamento original, por exemplo, para limpar informações confidenciais do buffer de rolagem, a versão sem alias pode ser facilmente invocada acrescentando uma barra invertida \como explicadoaquiouaqui. Isso ficaria assim

\clear

informação relacionada