Alguns dias atrás eu aprendi, que eu posso usar
"\ej": history-search-backward
"\ek": history-search-forward
para evitar as teclas de seta. Agora, enquanto isso funciona como um encanto e eu comecei a ler os bash-docs para aprender mais sobre .inputrc. Por favor, dê uma olhada nesta página (especialmente a parte sobre atalhos de teclado.) https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html#Readline-Init-File-Syntax \e é mencionado como "um caractere de escape". Embora o inglês não seja minha primeira língua, eu nunca assumiria que isso poderia ser usado para mapear Alt. Esse é um esquema em andamento comigo e documentação. Eles parecem um pouco mais explicativos do que explicativos para mim. A questão é: onde está realmente escrito esse material, para que outros possam saber e dar a dica em primeiro lugar?
O mapeamento da
Alt
chave paraEscape
(ASCII 033,"\e"
) é feito pelo seu emulador de terminal, a biblioteca readline (que trata do~/.inputrc
) não faz parte dela.O problema é que não há como enviar os eventos de chave reais para um programa em execução em um terminal; o terminal irá convertê-los em seqüências de bytes que o programa pode ler do tty.
Para a tecla Alt/Meta, existem duas maneiras de fazer isso:
Mapeie-o para Escape (ASCII 033 / 0x1b) -- pressionando
Alt-K
na verdade enviará"\ek"
,Alt-Shift-K
"\eK"
, etc. Este é o padrão na maioria dos emuladores de terminal, mas geralmente é configurável e você tem todos os motivos para torná-lo o padrão se já não for .Ative o 7º bit alto no valor ASCII da chave - pressionar
Alt-K
na verdade enviará o0x6b | 0x80 = 0xeb
byte,0x6b
sendo o valor ASCII de"k"
.É o último que é reconhecido como
"\M-k"
em ligações readline.E isso não funciona e é terrivelmente quebrado com qualquer localidade multibyte como
en_US.UTF-8
(que é o padrão na maioria dos sistemas modernos). Nesse sistema, o emulador de terminal pode não enviar o0xeb
byte bruto (que não é uma sequência UTF-8 válida, mas lixo binário), mas pode convertê-lo de ISO-8859-1 para UTF-8, resultando no"\xc3\xab" = "ë"
(e
com trema ) sendo enviado quandoAlt-K
é pressionado.Mas readline não sabe como mapear de
"ë"
volta,"\M-k"
não importa o quanto você mexa com a infinidade de opções comoconvert-meta
,enable-meta-key
,input-meta
, etc.E mesmo se você pudesse fazer isso, isso ainda estaria quebrado, porque as pessoas podem realmente querer digitar
"ë"
e"ó"
e não apreciar aqueles que são tratados como chaves não relacionadas comoAlt-K
eAlt-S
.Você deve descobrir que
\e
é o caractere de escape (o que significa que há apenas um deles, o código de caractere 27, geralmente escritoESC
) em vez de um caractere de escape (ou seja, um entre vários).Acho que neste caso a documentação está tentando dizer que
\e
representa uma instância do caractere ESC, para que se possa escrever\e\e
dois caracteres ESC.Não representa ALT.