Ao usar o clear
comando, a tela é limpa. Totalmente. Não tenho mais acesso a nenhuma das coisas que estavam anteriormente na tela.
Existe uma maneira de "limpar" a tela (ou seja, fazer o prompt ir para o topo da tela) sem apagar tudo o que estava na tela? Idealmente, eu gostaria de "limpar" a tela, mas poder rolar para cima para ver todo o resto.
Estou usando o programa Windows Terminal e o shell do PowerShell, mas também gostaria de saber a resposta para a linha de comando do Windows.
Eu coloquei que queria manter a capacidade de rolar para cima - com isso quero dizer que quero ver tudo o que veio antes de apertar o comando "clear", então... sim, quero manter tudo o que veio antes, não o histórico de comandos.
PSReadline (manipulador de entrada padrão do PowerShell) tem a tecla de CtrlLatalho encontrada na maioria dos shells Unix, que limpa a tela como se você forçasse todo o texto a rolar (como o caractere ASCII "Form Feed" faria).
No PS5, embora ainda apague completamente o texto exibido - mas tudo o que já foi para a rolagem permanecerá na rolagem.
Como solução alternativa, você pode gerar linhas vazias suficientes para empurrar tudo para a rolagem:
... e, em seguida, traga o cursor para o topo:
Isso também pode ser vinculado a uma chave usando
Set-PSReadlineKeyHandler -ScriptBlock
.O Cmd não tem um equivalente – ele lê a entrada no modo de linha, com apenas alguns atalhos fornecidos pelo Conhost. No entanto, você ainda pode criar um script em lote (ou mesmo um alias Conhost DOSKEY) que produziria as mesmas sequências VT.
Enquanto limpar a tela é uma função de terminal (através de códigos de controle de terminal ANSI), a maneira como você recebe esses códigos enviados pode ser diferente dependendo do shell. A ideia geral é que:
ESC[2J
limpa a tela, mas deixa a rolagemESC[3J
limpa a tela, incluindo toda a rolagem... onde
ESC
representa o código de caractere ASCII 27.De acordo com
man clear
o Linux, o2J
código era originalmente (em 1999) uma extensão para o XTerm, que foi escolhido pelo kernel do Linux em 2011 para o driver do console. Algum tempo depois, o Windows Console Host o pegou e está no Windows Terminal provavelmente desde o início.Terminal do Windows (para todos os shells)
O Terminal do Windows inclui a
clearBuffer
ação que pode ser vinculada a qualquer tecla de atalho. No entanto, ele afeta todos os shells, independentemente de qual aplicativo esteja sendo executado dentro dele . Por esse motivo, recomendo não usá-lo, a menos que você tenha certeza de que não pressionará acidentalmente a tecla de atalho quando estiver em algo comovi
(ou pior).Dito isso, é definitivamente a maneira mais fácil de obter essa funcionalidade no CMD.
Se você quiser usá-lo, a
clearBuffer
ação permite que você especifique umclear
destino de:screen
scrollback
all
Usar a
screen
opção limpará o conteúdo atual da tela, mas deixará a rolagem no lugar.Você precisará editar seu Windows Terminal
settings.json
diretamente, pois a interface do usuário não tem como definir oclear
destino:PowerShell
Para o PowerShell , como user1684 me venceu Ctrl + Lenvia a sequência de escape adequada.
Por outro lado,
Clear-Host
(aliasclear
) no PowerShell envia umESC[3J
(limpando a rolagem também).Se você tiver memória muscular ao digitar
clear
no PowerShell, basta alterar sua definição:Coloque isso em seu perfil do PowerShell se quiser que seja permanente.
CMD
É possível, mas complicado fazer isso no CMD também.
O maior problema no CMD é realmente obter o caractere ESC (ASCII 27) impresso. Eu tinha o "caractere" real colado aqui que seria transferido via copiar/colar para o CMD, mas foi apagado na primeira vez que fiz outra edição neste post. O personagem ainda está lá no histórico de edição (fonte) para esta resposta, mas vamos encontrar uma maneira melhor de fazer isso.
No PowerShell , use isso para criar um arquivo de lote CMD :
A execução do
clear.cmd
arquivo de lote resultante no CMD deve limpar a tela (mas não a rolagem).Se você tiver problemas com isso, qualquer maneira de imprimir um ASCII 27 seguido por
[2J
deve funcionar. Se você tiver o PowerShell Core instalado, por exemplo:E apenas para fornecer alguns detalhes adicionais em um de seus comentários:
Então, sim, encontramos uma solução alternativa, mas honestamente não me surpreenderia se não tivéssemos. Lembre-se, o Windows Console Host (no qual o CMD costumava ser executado por padrão) remonta ao Windows 95 (há 27 anos), bem antes de o XTerm adicionar esses códigos.
E embora o Windows Terminal seja muito mais moderno, não acho que o CMD (que precisa gerar os códigos) tenha visto nenhuma atualização substancial desde antes do lançamento do PowerShell em 2006.
Realmente, eu me considero sortudo por termos uma solução alternativa ;-).
Subsistema Windows para Linux
ESC[2J
(deixe o scrollback).clear
funcionará como no PowerShell, limpando a tela e rolando para trás (ESC[3J
).clear -x
vai deixar a rolagem (ESC[2J
)Como solução alternativa, no CMD, você pode manter pressionado Ctrl↓ (Down arrow)até que a tela esteja vazia. Ele rolará para baixo bastante rápido, então é possível rolar muito. Nesse caso, você pode pressionar Ctrl→ (Right arrow)ou começar a digitar, e a linha de prompt volta a aparecer. Qualquer coisa que mova o cursor fará.
Isso não parece funcionar no Powershell, infelizmente.
Use para CMD e PowerShell o comando clear screen.
Digitar :
cls