Como é que o Bash reinicia em um atalho, por exemplo, alt-0 em um vínculo não está funcionando
bind -x '"\e0":"reset"'
funciona (dá eco visível ao pressionar a tecla) apenas no primeiro início / tempo logo após a liberação da tela,
e continua sendo como pressionamento de tecla ecoado invisível
Alguma solução correta?
tl; dr
Análise
Testei no Kubuntu 22.04 LTS.
Esta é uma saída de exemplo de
stty -a -F /dev/pts/X
quando um Bash interativo lê de/dev/pts/X
:Esta é uma saída de exemplo de
stty -a -F /dev/pts/X
quando um Bash interativo lê/dev/pts/X
logo após o pressionamento de tecla ser acionadoreset
:O mais importante é
icanon
, onde deveria estar-icanon
. Isso significa que logo após serreset
acionado pelo pressionamento de tecla o terminal está no modo canônico, ou seja, ele não passa caracteres para o programa de leitura (aqui: Bash) até que você pressione Enter(ou Ctrl+ j, ou Ctrl+ m; ou Ctrl+ d).No modo canônico, você pode pressionar Alt+ 0e verá
^[0
(por causa daecho
configuração), mas o Bash o lerá (e reagirá a ele) somente após Enter. Após Entero Bash também alterará as configurações para o que espera, para que mais tarde seu Alt+ 0funcione novamente (e "quebre" novamente).As configurações que o Bash espera (e impõe, mas aparentemente não diretamente após
reset
o acionamento do pressionamento de tecla) incluem-icanon
. Nesse modo, cada pressionamento de tecla não interceptado pelo driver do terminal é passado para o Bash imediatamente.Solução
Você pode resolver o problema fazendo com que o pressionamento de tecla seja executado não apenas
reset
, mas pelo menosstty -icanon -echo
depoisreset
. Existem mais diferenças entre as duas saídas que postei acima; a correção completa está emstty lnext "" discard "" -icrnl -icanon -echo
. Assim, a ligação deve ser: