Por que o “shift-tab” resulta em “Escape” no terminal?

3

Eu só notei isso por acidente.

Eu uso o modo de linha de leitura vi (run set -o vi in bash ), então é particularmente perceptível; em emacs readline mode Eu não acho que Esc faça qualquer coisa, mas no modo vi ele sai do modo de inserção (entra no modo normal).

Eu não vejo Shift - Tab documentado em man bash , e parece que a sua interpretação como uma tecla Esc é em um nível mais básico que bash . Possivelmente em readline?

Funciona no Mac OS X e no Linux.

Onde posso encontrar isso documentado?

    
por Wildcard 24.10.2015 / 21:52

2 respostas

5

Shift + A tecla Tab em vários terminais envia uma seqüência de escape como esta

ESC [ Z

Ele faz parte do terminal de console do Linux desde 1995 , parte do xterm desde 2002 , e usado em terminais emulando um ou outro daqueles desde então.

Na descrição terminfo , isso seria expresso como

kcbt=\E[Z,

e kcbt estão documentados em terminfo(5) :

key_btab                  kcbt   kB   back-tab key

Do ponto de vista da análise, não há diferença entre isso e pressionar alguma tecla de função. readline tem casos especiais para várias teclas de edição (vistas após a chamada para tgetent no lib/readline/terminal.c do bash), mas o termcap "kB" não faz parte disso.

    
por 24.10.2015 / 22:38
2

it would seem that its interpretation as an Esc key is at a more basic level than bash. Possibly in readline?

É ainda mais baixo que isso. Esta é uma propriedade fundamental de como os terminais funcionam em sistemas operacionais Unices e Unix-like. O sistema operacional vê terminal I / O como uma sequência de caracteres de 8 bits (ou até 7 bits). Teclas de função e chaves estendidas são transmitidas como seqüências de escape de caracteres múltiplos.

Em terminais reais, essas seqüências de escape são geradas pelo firmware no próprio terminal. Em programas de emulador de terminal, o emulador de terminal transforma dados de pressionamento de tecla (recebidos por qualquer interface de usuário usada para falar com um teclado, seja o sistema X Window, um dispositivo USB escondido ou um dispositivo de evento do Linux) em seqüências de escape.

Aplicativos como vim e várias bibliotecas de edição de linha tentam diferenciá-los de simples pressionamentos da tecla Esc por (na verdade) tempo de duração entre ler o caractere de escape e ler o seguintes caracteres. Se os personagens chegarem rapidamente o suficiente um após o outro, eles serão tratados como uma sequência de escape.

Where can I find this documented?

O tratamento de tempo limite de seqüências de escape na entrada é documentado em vim sob :help ttimeout e para o ZLE da Z Shell na página de manual zshzle . A ideia básica de que os terminais geram sequências de escape é amplamente documentada.

Documentação para as seqüências de escape específicas que são geradas é mais difícil de encontrar. Muitos, hoje em dia possivelmente a maioria, de terminais (em particular terminais emulados) falam as seqüências de escape que foram faladas pelos terminais DEC VT (quando estão no que o Digital chama de "modo ANSI") por muitos anos. O DEC fornece documentação para seus terminais, e você pode encontrá-lo explicitamente discutindo o que Shift + Tab está codificado como no capítulo 8 do documento de informações do programador VT525.

No entanto: Se você estiver usando um terminal virtual do kernel no Linux ou um BSD, onde o programa emulador de terminal faz parte do kernel do sistema operacional, a aderência às convenções DEC VT é marcadamente irregular quando se trata de entrada < seqüências de controle. Em parte, isso ocorre porque sistemas operacionais como o FreeBSD, na verdade, aderem às convenções do terminal virtual SCO XENIX por padrão, aqui. O resultado é uma mistura estranha de DEC VT e SCO XENIX que não tem correspondência com qualquer terminal real.

A mistura não é apenas uma incompatibilidade entre as emulações de terminal de entrada e saída. Isso é ainda mais agravado pelo fato de que as configurações modernas tentam anular os padrões SCO XENIX para seqüências de controle de entrada, mas o fazem apenas parcialmente. Então, por exemplo: em FreeBSDs recentes, pode-se descobrir que F6 é a seqüência de controle DEC VT CSI 1 7 ~ , ao invés da seqüência SCO XENIX que é compilada no Emulador de terminal do kernel, mas Shift + F6 ainda é a seqüência de controle SCO XENIX compilada em CSI d em vez da seqüência de controle DEC VT CSI 1 7 ; 2 ~ .

E nada disso está no doco do FreeBSD.

Leitura adicional

por 27.10.2015 / 11:31