Eu gostaria de poder limpar meu buffer de rolagem no Windows Terminal usando um atalho de teclado.
No WSL eu posso apertar Ctrl+ Le ele faz um form-feed (equivalente ao clear -x
comando), que limpa a tela, mas apenas rolando o conteúdo acima e fora de vista.
O que eu gostaria de fazer é, por exemplo, pressionar Ctrl+ K(como o Terminal do macOS) para poder limpar a tela corretamente (semelhante a emitir um clear
comando simples) no WSL e no PowerShell.
Isso é possível?
Atualização : agora é suportado nativamente no Windows Terminal. Eu adicionei minha própria resposta abaixo e aceitei, mas está um pouco escondida, então aqui está um link: https://superuser.com/a/1628815/2924
Atualização 2021-10-20 : Isso agora é suportado nativamente a partir da versão 1.12 (em visualização no momento da redação).
Veja PR #10906 para detalhes completos.
Essas ações podem ser invocadas a partir da paleta de comandos ou podem ser vinculadas a atalhos de teclado por meio da interface do usuário de configurações e diretamente
settings.json
conforme abordado na documentação oficial .Para referência, aqui está uma discussão sobre a diferença entre Cmd ⌘+ Ke Ctrl+ L: Qual é a diferença entre Ctrl+L e Cmd+K para limpar a tela do terminal?
Resposta mais longa
De acordo com Mike Griese ( zadjii-msft no GitHub), um engenheiro que trabalha no Windows Terminal:
Dustin Howett ( DHowett-MSFT no GitHub) continua dizendo:
Referência: https://github.com/microsoft/terminal/issues/1882
Bem, isso se transformou em um rastro de coelho e meio ;-) ...
Eu teria pensado que isso teria sido bastante direto com a
sendInput
ação introduzida no Windows Terminal 1.3, mas continuo falhando usando esse método. Não afirmo ser nenhum especialista em atalhos de teclado ou sequências de escape de terminal, mas estou tentando atrapalhar.Primeiro, de
man clear
, a sequência "clear scrollback" éEsc[3J
. Isso funciona no Windows Terminal via:Write-Output "`e[3J"
printf '\033[3J'
(ou equivalenteecho
)É claro que precisa ser acoplado com a sequência "limpar tela inteira" (
\033[2J
) e o "cursor para a posição inicial" (\033[H
) (obtido nesta resposta ).Junte-os e
printf '\033[2J\033[3J\033[H'
obtenha-nos oclear
comportamento (sem argumentos).Então, eu pensaria, dado o
sendInput
exemplo nas notas de lançamento do Windows Terminal 1.3, que poderíamos enviar esse código de escape via:na
"actions"
seção (anteriormente"keybindings"
). O\u001b[A
exemplo (seta para cima) funciona bem para mim, mas o "clear scrollback" resulta em um sino de erro no bash e na impressão[3J
em fish. O mesmo ocorre para\u001B[2J
tentar limpar a tela também. Se alguém puder descobrir onde estou errando nisso, eu adoraria saber.Mas... podemos religar as chaves nas conchas. No entanto, eles provavelmente não serão capazes de dizer a diferença entre + Ctrle L++ Ctrlpor esse motivoShift . Exceto para o recente PSReadLine 2.0, que diferencia maiúsculas de minúsculas em combinações de teclas.L
Portanto, se você realmente deseja usar Ctrl++ nos shells do PowerShell Shifte ldo Linux no WSL, precisará fazer isso em duas etapas:
Primeiro, configure uma ação do Terminal do Windows para
sendInput
com um código de chave não utilizado:Honestamente, não tenho certeza de qual é a melhor maneira de escolher um código de chave. Acabei de usar algo do conjunto de caracteres Hangul
\uAC12
( ), já que tenho certeza de que nunca vou encontrar isso na vida real. Observe que este comentário recomenda o uso do intervalo " uso privado "E000-EFFF
, mas parecia bastante preenchido no Windows Terminal e eu já havia resolvido o Hangul, então deixei os exemplos abaixo usando\uAC12
.Então, precisamos vincular
\uAC12
em cada shell para enviar as sequências de escape corretas:Bash:
Primeiro, obtenha a sequência de chaves para vincular com
printf '\uAC12' | xxd
, o que resulta em00000000: eab0 92
.Em seguida, usando essa saída, codifique o comando bind como
bind -x '"\xEA\xB0\x92":"printf \\033[2J\\033[3J\\033[H"'
(xxd
ideia de um comentário nesta resposta .)Zsh: Parece estar um pouco mais envolvido:
(com a ajuda desta resposta ).
Peixe:
bind \uAC12 "printf '\033[2J\033[3J\033[H'; commandline -f repaint"
PowerShell:
Set-PSReadLineKeyHandler "$([char]0xAC12)" -ScriptBlock { Write-Output "`e[2J`e[3J"; [Microsoft.PowerShell.PSConsoleReadLine]::ClearScreen() }
. Ajude na[char]
conversão desta resposta e, caramba, se não demorei para encontrar um exemplo de chamada de uma função PSReadline em um ScriptBlock.Núcleo do PowerShell:
Set-PSReadLineKeyHandler "$([char]0xAC12)" -ScriptBlock { Write-Host "`e[2J`e[3J"; [Microsoft.PowerShell.PSConsoleReadLine]::ClearScreen() }
. Não tenho certeza por que o PowerShell e o PowerShell Core se comportam de maneira diferente aqui.Correções ou sugestões de melhoria são bem-vindas.
Edite seu
~/.bashrc
Agora você pode digitar
cls
para limpar a tela e rolar para dentro de sua sessão do WSL do bash.Edite seu arquivo JSON do Terminal do Windows
Agora pressionando CTRL+ kirá inserir o comando CLS para você. Para o PowerShell ou um prompt CMD, o comando CLS já tem suporte por padrão, portanto, nenhuma configuração extra é necessária.