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