Como configurar a restauração da tela em um terminal?

9

Dependendo do terminal / ambiente, a sequência seguinte tem efeitos diferentes:

$ ls
1
2
$ man ls
enter q

Ou vejo a última tela de homem-página exibida acima do prompt atual ou a saída ls e a saída anterior do shell são restauradas. O mesmo efeito é observado, e. ao usar vim e depois suspendê-lo para fazer algo no shell.

No Fedora 19 - o padrão da tela parece ser no-restore, o gnome-terminal / xterm usa o restore por padrão.

No Solaris, isso depende do terminal usado / terminfo db.

Eu quero configurar o comportamento de restauração de forma consistente entre diferentes sistemas / terminais.

    
por maxschlepzig 03.08.2013 / 11:11

1 resposta

13

O recurso parece ser chamado de 'tela alternativa' ou alternando entre as telas normal e alternativa.

Você pode explorá-lo usando um xterm. Por exemplo, digite man man em xterm e exit man. Agora você pode alternar para a tela alternativa via Ctrl + Mouse2 (clique do meio) - > 'Mostrar tela alternativa'. Em alternativa, pode introduzir directamente as sequências de controlo xterm , por exemplo:

$ echo -e '3[?47h' # alternate screen
$ echo -e '3[?47l' # normal screen

Os últimos dois comandos também funcionam no gnome-terminal (provavelmente em outros também).

O que acontece quando a inicialização man / vi / less etc. é basicamente eles enviam um comando abstrato de tela clara. Na saída (ou suspensão), eles enviam um comando abstrato da tela de restauração. A forma como o comando se traduz em sequências de controle de terminal de concreto é definida no banco de dados terminfo .

Desativar troca de tela alternativa

O que deve funcionar para todos os terminais é ajustar as entradas locais do terminfo, ou seja, remover o mapeamento de comandos abstratos de limpar / restaurar a tela.

Você pode fazer assim - para a entrada $TERM atual (para o gnome-terminal no Fedora 19, por exemplo):

$ echo $TERM
xterm-256color
$ infocmp -1 > xterm-256color
$ sed 's/^\(xterm-256color\)|/-na|/ ; /smcup\|rmcup/d ' \
    xterm-256color > xterm-256color-na
$ diff -u xterm-256color* 
--- xterm-256color  2013-08-04 16:33:52.041393461 +0200
+++ xterm-256color-na   2013-08-04 16:36:56.829930520 +0200
@@ -1,5 +1,5 @@
 #  Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm-256color
-xterm-256color|xterm with 256 colors,
+xterm-256color-na|xterm with 256 colors,
    am,
    bce,
    ccc,
@@ -155,7 +155,6 @@
    rin=\E[%p1%dT,
    rmacs=\E(B,
    rmam=\E[?7l,
-   rmcup=\E[?1049l,
    rmir=\E[4l,
    rmkx=\E[?1l\E>,
    rmm=\E[?1034l,
@@ -170,7 +169,6 @@
    sgr0=\E(B\E[m,
    smacs=\E(0,
    smam=\E[?7h,
-   smcup=\E[?1049h,
    smir=\E[4h,
    smkx=\E[?1h\E=,
    smm=\E[?1034h,
$ tic xterm-256color-na # loads the file to $HOME/.terminfo
$ find ~/.terminfo -type f
$ HOME/.terminfo/x/xterm-256color-na

Agora você pode testá-lo via:

$ TERM=xterm-256color-na man man # and then hit q

Você pode repetir as etapas acima para outros terminais se usar vários. Se tudo funcionar como esperado, você pode definir TERM via seu arquivo rc do shell.

Você também pode especificar diretamente o nome do terminal como um parâmetro para infocmp , por exemplo:

$ infocmp -1 screen > screen

Ativar troca de tela alternativa

Alguns terminais suportam o recurso alternativo de alternância de tela (por exemplo, tela ), mas desativá-lo no padrão .

Para screen , você pode ativá-lo por meio do seu ~/.screenrc :

$ cat ~/.screenrc
altscreen

Se você fizer login remoto via ssh para - digamos - um sistema Solaris, talvez o banco de dados terminfo do sistema configurado remotamente seja de tipo histórico, quebrado ou inclua alguns padrões incomuns / específicos do Solaris que não correspondam ao 'sangramento' terminais de borda que você executa o ssh.

Assim, é uma opção apenas copiar o banco de dados terminfo local de / usr / share / info (no cliente) para host:~/.terminfo (no servidor).

Caso o formato terminfo compilado não seja compatível, você também pode exportar / importar as entradas como no parágrafo anterior.

Eu testei com um terminfo-db a partir de uma instalação Cygwin e copiei-o diretamente para um sistema Solaris 10 funcionado.

No caso de você querer compartilhar um db terminográfico alternativo entre usuários, você especifica seu caminho através da variável de ambiente TERMINFO .

Ignore a sequência de controle

Alguns terminais suportam a desativação da sequência de controle para troca de tela alternativa. Por exemplo, o xterm tem uma opção, o gnome-terminal não tem.

Para o xterm, é o X-ressource , por exemplo

XTerm*titeInhibit: true

Configurações específicas do programa

Alguns programas têm arquivos de configuração para configurar quais comandos de controle / sequência de controle eles enviam. Por exemplo

$ LESS=X less foo

configura less para não limpar / restaurar a tela.

Para vim , você pode incluir algo como

set t_ti= t_te=

em você ~/.vimrc .

Eu não encontrei na opção como configurar esse comportamento para o topo - por padrão, ele não envia a tela de restauração.

    
por 04.08.2013 / 17:55