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

10

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

$ ls
1
2
$ man ls
enter q

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

No Fedora 19 - o padrão da tela parece ser sem restauração, um gnome-terminal / xterm usa o do-restore por padrão.

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

Desejo configurar o comportamento da restauração de forma consistente entre diferentes sistemas / terminais.

maxschlepzig
fonte
Se você sempre executar a tela GNU, obterá um comportamento consistente.
Jordanm #

Respostas:

16

O recurso parece ser chamado de 'tela alternativa' ou alternar entre a tela normal e a alternativa.

Você pode explorá-lo usando um xterm. Por exemplo, digite man manum xterme saia do homem. Agora você pode alternar para a tela alternativa via Ctrl+ Mouse2 (clique do meio) -> 'Mostrar tela alternativa'. Como alternativa, você pode inserir diretamente as seqüências de controle xterm , por exemplo:

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

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

O que acontece quando o man/ vi/ lessetc. startup é basicamente eles enviam um comando abstrato de tela limpa. Na saída (ou suspensão), eles enviam um comando abstrato restore-screen. Como o comando se traduz em seqüências concretas de controle de terminal é definido no banco de dados terminfo .

Desativar alternância de tela alternativa

O que deve funcionar para todos os terminais é ajustar as entradas locais da terminfo, ou seja, remover o mapeamento de comandos abstratos de tela de limpeza / restauração.

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

$ echo $TERM
xterm-256color
$ infocmp -1 > xterm-256color
$ sed 's/^\(xterm-256color\)|/\1-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 o esperado, você pode configurar TERMatravés do seu arquivo rc shell.

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

$ infocmp -1 screen > screen

Ativar alternância de tela alternativa

Alguns terminais suportam o recurso de alternância de tela alternativa (por exemplo, tela ), mas desativam-no por padrão .

Para screenvocê pode habilitá-lo através do seu ~/.screenrc:

$ cat ~/.screenrc
altscreen

Se você fizer logon remoto via ssh para, digamos, um sistema Solaris, talvez o banco de dados terminfo de todo o sistema configurado remotamente seja histórico, quebrado ou inclua alguns padrões incomuns / específicos do Solaris que não correspondem aos terminais 'de ponta' você executa o ssh.

Portanto, é 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 tentei com um terminfo-db de uma instalação do Cygwin e copiá-lo diretamente para um sistema Solaris 10 funcionou.

Caso você queira compartilhar um terminfo db alternativo entre usuários, especifique seu caminho através da TERMINFOvariável de ambiente.

Ignorar a sequência de controle

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

Para xterm, é o recurso X , por exemplo

XTerm*titeInhibit: true

Configurações específicas do programa

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

$ LESS=X less foo

configura lesspara não limpar / restaurar a tela.

Para vimvocê pode incluir algo como

set t_ti= t_te=

em você ~/.vimrc.

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.

maxschlepzig
fonte
O cmd sed realmente exclui toda a linha que contém smcupou rmcup. No meu caso, existem outros itens na mesma linha que eles. Esses outros itens também foram excluídos. Então, talvez algo como s/[sr]mcup=[^,]*,//'seja melhor.
Mingliang #