
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 clear
usa 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:
- linux3.0(o padrão atual para "linux")
- massa
- xterm+básico(um bloco de construção usado na maioria das variantes "xterm")
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 oE3
capacidade 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 emhttps://ghostbin.com/paste/kfsbjé consistente com esse conselho:
- o nome do caminho
/home/flowerpick/.terminfo/x/xterm
seria usado por ncurses - os recursos
AX
eXT
são recursos estendidos (comoE3
), mostrados com a-x
opçã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 infocmp
saí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, uxrvt
define $TERM
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 st
programa 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 clear
o 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[1J
apaga 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
hpa
sequê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 .bashrc
ajudou:
alias clear='printf "\E[H\E[2J"'
Lembrete: as alterações .bashrc
entrarão em vigor após você abrir um novo terminal!
Responder3
Eu costumo usar rotineiramente clear
para 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