Bash clear comando comportamento estranho elimina o buffer de rolagem.

2

Sempre que eu corro em meu terminal, ele apaga o buffer de rolagem do topo da tela para a linha atual. Eu tentei isso em xterm, st e urxvt, e o problema permanece. Existe alguma maneira que eu possa mudar o comportamento do claro para que ele não toque no buffer de rolagem?

    
por Alvo 23.10.2016 / 06:01

1 resposta

4

O comentário "da parte superior da tela para a linha atual" é ambíguo. Se você quis dizer a partir do topo da parte visível da tela, isso não é o scrollback . A rolagem de um terminal é a parte que você pode ver apenas usando a barra de rolagem (ou teclas adequadas, como troca de página).

Sequências de controle do XTerm documentam 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 clear usa o penúltimo, por exemplo,

clear=\E[H\E[2J

para posicionar o cursor no canto superior esquerdo e, em seguida, limpar a tela inteira (visível). Você poderia usar o Erase Below , mas isso não é usado na descrição do terminal.

Referindo-se a limpar o scrollback : Esse é um recurso específico do terminal, originalmente uma seqüência de escape no xterm ( 1999 , documentado em ctlseqs.ms mas não mencionado nas alterações) e posterior ( 2011 ) implementado como uma extensão para o console do Linux e a descrição do terminal correspondente . O banco de dados do terminal o relaciona como uma "extensão diversa" .

Atualmente, essas descrições de terminal têm o recurso:

Se ele é suportado no xterm, o VTE teria que ser respondido por testes (não há documentação útil para VTE ou Konsole).

Se preferir não usar a extensão, você pode remover o recurso E3 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 -1 e -x para simplificar a formatação e mostrar o recurso a ser alterado. O exemplo dado no link é consistente com esse conselho:

  • o caminho /home/flowerpick/.terminfo/x/xterm seria usado por ncurses
  • os recursos AX e XT são recursos estendidos (como E3 ), mostrados com a opção -x .

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

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

Por exemplo, uxrvt define $TERM como algo 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 programa st usa xterm (ou possivelmente xterm-256color ), embora tenha sido um tempo desde que eu vi uma cópia de que que funcionou bem o suficiente para comentar.

A propósito, você poderia ter um alias para clear , que está enviando a seqüência de escape (ignorando a descrição do terminal), mas eu não vi isso relatado por ninguém.

Se você quiser "limpar acima", isso não é tão simples quanto digitar "limpar". O escape 3[1J apaga do canto superior esquerdo para a posição atual do cursor. Você pode criar um script que faça isso para limpar apenas as linhas acima do seu cursor atual:

  • use o relatório de posição do cursor para encontrar a linha / coluna na qual 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 depois (com a sequência hpa ) mova certo um número grande,
  • emita o "claro acima" e
  • retorna para a posição original usando cup (endereçamento do cursor).

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

    
por 23.10.2016 / 12:55

Tags