Como redefinir a rolagem no terminal através de um comando shell?

41

Ao usar o Terminal.app, você pode limpar a tela usando o shell interno clearou pressionando ^+ L(Control-L).

No entanto, tudo o que isso faz é empurrar o conteúdo da tela atual para trás uma altura da tela e redefinir o cursor / entrada na primeira linha. Ou seja, você ainda pode rolar para trás e vê-lo.

O que você também pode fazer é redefinir todo o seu scrollback pressionando + K(Command-K).

Depois de fazer isso, você não poderá voltar atrás.

Em certas situações (principalmente antes da execução screenou vim), eu gostaria de redefinir a rolagem antes que o comando realmente seja executado.

Existe um comando (como clear) implementado no OS X que me permita fazer isso? Dada a existência de pbcopye pbpaste, estou pensando que algo semelhante possa existir que me permita fazer isso.

Jason Salaz
fonte
Como páginas Chris resposta diz no comando uso Terminal: clear && printf '\e[3J' (Você selecionou a resposta errada como resposta correta!)
Cyborg

Respostas:

57

O terminal suporta uma extensão da sequência de escape ED (Apagar no visor) para apagar a rolagem para trás. Também é suportado pelo xterm. O comando ED, descrito no manual do VT100 , aceita estes valores para o parâmetro Ps:

ESC [Ps J

Parâmetro Parâmetro Significado

0 Apague da posição ativa até o final da tela
1 Apague do início da tela para a posição ativa
2 Apague toda a tela

O terminal ( e o xterm ) adiciona:

3 Apague a rolagem para trás (também conhecida como "Linhas salvas")

Observe que isso apaga apenas a rolagem para trás, não a tela. Isso permite apagar um ou outro, ou ambos, enviando duas seqüências de escape.

Por exemplo, você pode limpar a tela e retroceder com o seguinte comando shell: clear && printf '\e[3J'

(O clearcomando procura a sequência apropriada para limpar a tela do terminal atual, mas a sequência de escape “apagar rolagem para trás” é personalizada e deve ser codificada. Se você colocar isso em um script de shell que não conhece com certeza só vai ser executado com o Terminal, você deve verificar se $TERM_PROGRAMé Apple_Terminalantes de enviá-lo.)

Chris Page
fonte
4
Isso é muito mais rápido que o osascript!
Sergei
3
Esta é uma resposta muito melhor. Portanto, para tornar isso permanente, adicione ao seu ~ / .bash_profile: alias clear="clear && printf '\e[3J'"
Tom
11
Coloquei este script no meu caminho:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV
2
@WalkerHaleIV Por que você está criando um executável em vez de apenas imprimir a sequência de escape no stdout?
Chris Page
11
$ TERM_APPLICATION deve ser $ TERM_PROGRAM
pbatey
30

⌘K, atalho para “Exibir> Limpar rolagem”.

UPDATE : Isso pode ser automatizado com AppleScript pelo seguinte comando:

osascript -e 'tell application "System Events" to keystroke "k" using command down'

… Que você pode, obviamente, aliascom o que quiser, ou armazenar em uma função no seu ~/.profilescript de login :)

Como segurança, no entanto, para poder usá-lo mesmo em segundo plano, sem correr o risco de pressionar uma tecla para um aplicativo frontal errado, aconselho envolvê-lo com o seguinte teste:

if application "Terminal" is frontmost

… Que nos fornece o seguinte código:

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

… Que por sua vez, devidamente escapado e aliased, termina em:

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

E aqui está o seu novo clear! :)

MattiSG
fonte
O ponto aqui é que eu gostaria de configurar algo no ambiente do meu shell para que, quando eu executo um comando (digamos vim), o shell execute o "scrollback reset" antes de executar o vim. Programático, não interativo.
Jason SALAZ
11
@JasonSalaz Ok, não entendi, desculpe. Código adicionado para isso.
precisa saber é o seguinte
11
@ JasonSalaz, se esta resposta resolveu seu problema, lembre-se de validá-la. Se não, por favor, volte para nós nos comentários :) Lembre-se, os usuários do futuro será obrigado;)
MattiSG
Essa história em quadrinhos é sobre mim, você sabe. Eu faço programa em Denver, CO (Não, não realmente, seria loucura se fosse, no entanto.).
Jason SALAZ
Isso não funciona para mim. Tanto quanto posso dizer, é o equivalente a digitar clear; isto é, limpa a tela, mas ainda posso voltar. Bater Command Kfunciona normalmente.
Zev Eisenberg
7

Aqui está o código que funciona para o Terminal do macOS e para o iTerm2. Também não precisa que a janela esteja em primeiro plano.

printf '\033[2J\033[3J\033[1;1H'

Como funciona

Essa é uma composição de 3 seqüências de escape ANSI , particularmente os comandos "Control Sequence Introducer" .

\033é uma sequência de escape que codifica o ponto de código para o caractere que representa. A 0indicação inicial indica que o restante da sequência codifica um valor octal, nesse caso, 33em octal. O valor decimal disso é 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). No ASCII, o ponto do código 27é o caractere "ESC" (escape).

CSIcomandos começam com ESC [, aka \033[. Sabendo disso, podemos dividir a corda em três partes.

  1. CSI 2 J
    • Esta é uma instância do comando "ED - Apagar na exibição", que tem o formato CSI n J
    • O nvalor é definido como 2neste caso, que chama a segunda variante: "Se n for 2, limpe a tela inteira (e move o cursor para a parte superior esquerda no DOS ANSI.SYS)."
  2. CSI 3 J:
    • Esta é uma instância do comando "ED - Apagar na exibição", que tem o formato CSI n J
    • O nvalor é definido como 3neste caso, que chama a terceira variante: "Se n for 3, limpe a tela inteira e exclua todas as linhas salvas no buffer de rolagem (esse recurso foi adicionado ao xterm e é suportado por outros aplicativos de terminal)."
  3. CSI 1 ; 1 H:
    • Esta é uma instância do comando "ED - Apagar na exibição", que tem o formato CSI n ; m H

      Move o cursor para a linha n, coluna m. Os valores são baseados em 1 e o padrão é 1 (canto superior esquerdo) se omitido. Uma sequência como CSI ;5Hé um sinônimo CSI 1;5He também CSI 17;Hé a mesma que CSI 17H eCSI 17;1H

    • Os valores ne msão definidos como 1, o que significa que este comando move o cursor para o canto superior esquerdo.
Alexander - Restabelecer Monica
fonte
Posso perguntar de onde você tirou isso? +1 de mim - funciona mesmo assim
rbrtl
11
Não me lembro, mas é uma composição deles: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Restabelecer Monica
11
Parece que é " CSI n J" (onde n = 2) + " CSI n J" (onde n = 3) + " CSI n ; m H" (onde n, m = 1, 1), que se traduz em: "ED - Apagar no visor" (variante 2), "ED - Apagar na tela" (variante 3), "CUP - posição do cursor" (movendo para 1, 1)
Alexander - Restabelecer Monica