Mapeamento intr para del chave

1

Estou no processo de migração de um aplicativo legado 4GL do SCO OpenServer 5.0.7 para o CentOS (Red Hat) Linux 5.9.

Existem várias telas que pedem que o usuário pressione "DEL para ABORTAR", mas na verdade está capturando o sinal de interrupção.

Como posso mapear stty intr para a chave DEL para consistência? É possível mapear a interrupção para uma sequência ansi?

O PuTTY está gerando os seguintes códigos de controle para cada uma dessas chaves:

DEL : ^[[3~

BACKSPACE : ^?

SHIFT BACKSPACE : ^H

Não consigo encontrar uma opção dentro do PuTTY para remapear a chave DEL especificamente.

    
por jamesallman 01.04.2013 / 18:05

2 respostas

5

O personagem que está esperando é ^ ?, que era uma chave chamada DEL em seus terminais herdados (por exemplo, VT220).

Você pode fazer stty intr ^? antes de iniciar o aplicativo para fazer isso usar isso para o sinal de interrupção, mas eu não sei se há uma maneira de configurar o Putty para enviá-lo para o DEL. Eu sei que alguns outros terminais permitem que ele seja remapeado.

Você não pode simplesmente alterar a mensagem impressa?

Você pode precisar de um emulador de terminal diferente ou de uma camada de emulação de terminal extra semelhante à tela entre o terminal e o aplicativo.

EDIT: Se você selecionar a opção "SCO" em "Teclas de função e teclado", a tecla DEL deve gerar ^? , que você pode mapear para stty intr. Você também deve definir o Backspace para Control-H. Também é possível que o aplicativo espere que as sequências de caracteres que as teclas Home, End, etc geram nesse modo, desde que você disse que era um aplicativo projetado para ser executado em um sistema operacional SCO.

No entanto, você deve considerar a resposta do @StephaneChazelas, já que usar a tela para isso criaria um ambiente mais controlado (ou seja, você não precisaria configurar o putty na máquina cliente de todos)

    
por 01.04.2013 / 18:25
5

O caractere intr , deve ser um caractere, não pode ser uma sequência de caracteres.

Como o Random832 sugeriu, usar screen é provavelmente sua melhor aposta. Em seguida, ele funcionaria em qualquer terminal.

screen emula um terminal dentro de outro terminal. Por padrão, o terminal que ele emula envia ^? no Backspace e ^[[3~ no Delete como o PuTTY, mas você pode mudar isso.

Por exemplo, se você criar um arquivo que contenha:

bindkey -k kb stuff ""
bindkey -k kD stuff "7"
termcap * '' 'kD=7:kb='
screen sh -c 'stty intr "^?" erase "^H"; exec my-legacy-app'

E use-o como screen -c /path/to/that-file

Ele emularia um em que Backspace envia ^H e Delete envia ^? .

A terceira linha é dizer para os aplicativos que usam termcap (por meio da variável de ambiente $TERMCAP ), mas observe que aqueles que usam terminfo não serão notificados.

    
por 01.04.2013 / 21:59