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