Qual é o esquema para representação textual de pressionamentos de teclas na tela?

4

Como posso derivar a seqüência de caracteres que representa uma determinada tecla na tela? Quero dizer, qual ligação toma como entrada. Por exemplo, 's' representa a tecla óbvia na tecla 's'. 'S' representa 'shift + s'. Mas a representação de outras combinações mais complexas não é clara para mim e o esquema que é seguido parece bastante obscuro.

Eu pesquisei ao redor e perguntou antes qual seria a representação para o caso em particular 'tab' e 'shift + tab ', mas não consegui encontrar a resposta. Então eu acho que o melhor é tentar entender o esquema geral. Eu também vi isso , mas agora está funcionando para mim.

Alguém pode explicar que tela de esquema / regras segue para isso? Quais são as regras para derivar a representação de qualquer combinação de chaves arbitrária? E eles são específicos da tela ou compartilhados com outros softwares? Outro software GNU talvez? Onde isso é documentado?

    
por ricab 25.10.2013 / 12:31

1 resposta

4

Não há esquema, screen , como qualquer aplicativo de terminal, não lida com pressionamentos de tecla, mas com caracteres ou sequências de caracteres que ele lê em um dispositivo terminal.

É o terminal (ou emulador de terminal como xterm ) que transforma um pressionamento de tecla em um caractere ou sequência de caracteres que ele envia por um fio (o fio sendo virtual no caso de um emulador de terminal) para o sistema. A disciplina de linha do dispositivo terminal pode fazer algumas modificações (por exemplo, CRs transformados em LFs).

Para saber qual caractere ou seqüência de caracteres screen recebe quando você digita algo no seu terminal, você pode usar por exemplo od para exibi-los para você.

Por exemplo, se eu inserir od -tc em um terminal, od -tc lerá caracteres do dispositivo terminal e os exibirá no stdout (o dispositivo terminal também se você não redirecionou a saída) em a < em> imprimível caminho.

Por exemplo, aqui está a saída quando eu digito: Acima Digite Ctrl + D (o último para significar od o fim de entrada):

0000000 033   [   A  \n
0000004

Acima enviou os 3 caracteres ESC, [ e A , e o \r foi alterado para \n .

screen irá realmente configurar seu terminal de host no modo raw para que nenhuma transformação seja feita pela disciplina de linha e nenhum caractere seja tratado especialmente (como o caractere 004 enviado em Ctrl + D acima, por exemplo).

Para ver o que o terminal envia nesse modo, você faria:

$ stty raw; stty min 1 time 10; dd count=1 2> /dev/null | od -tc; stty sane
0000000 033   [   A
                   0000003

Observe como a \n de saída por od não foi convertida para \r\n para saída ( \n é alimentação de linha, quando saída para um terminal, ela apenas moveu o cursor para baixo, não para o início da linha para a qual você precisa de um retorno de carro ( \r )).

Acima, estamos definindo o terminal no modo raw , mas também configuramos para que read no dispositivo terminal seja expulso depois de 10 centésimos de segundos, assim como 1 character foi recebido (caso contrário, teríamos que digitar muitos caracteres antes que o read feito por od retornasse).

Pressionar a tecla Tab em todos os terminais envia o caractere TAB ASCII também conhecido como \t ou ^I ou C-I ou 1 . Para Shift + Tab , nem todos os terminais enviam a mesma coisa (alguns enviam ESC [ Z , alguns enviam \t e alguns não enviam nada, por exemplo).

O banco de dados terminfo pode informar o que esse caractere é para um determinado terminal (baseado na variável $TERM ) através da capacidade kcbt ( back tab , não necessariamente enviada em Shift-Tab embora.

Para o terminal atual:

$ tput kcbt | od -tc
0000000 033   [   Z
0000003
    
por 25.10.2013 / 14:39