readline / bash: Como mapear as teclas Escape e Arrow?

6

De outro software orientado por linha de comando, estou acostumado com o seguinte comportamento: Seta para cima / baixo percorre o histórico de comandos, linhas correspondentes que correspondem aos caracteres digitados até agora na linha atual e Esc exclui tudo digitado até agora na linha atual. Estou tentando fazer bash (via readline) fazer o mesmo. Aqui está o que eu coloquei no meu .bashrc:

bind 'Escape: kill-whole-line'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

O comportamento não é o pretendido, devido à interferência do mapeamento de Escape="\ e" com o mapeamento das seqüências de escape "\ e [A" e "\ e [B".

Minha pergunta: Existe uma maneira de fazer isso funcionar? Uma possibilidade seria baseada no tempo, ou seja, se for seguida rapidamente por outra chave, ela é tratada como parte de uma sequência, mas se nada mais estiver ocorrendo durante um pequeno intervalo, ela será tratada como uma chave por si só. No entanto, lendo a documentação e readline eu não era capaz de chegar a uma coisa dessas.

Pergunta secundária: Existe um "emulador" de terminal moderno que na verdade não tenta emular o comportamento complicado de máquinas históricas, mas fornece programas que executam nele informações não ambíguas sobre as teclas pressionadas? O que também permitiria coisas como distinguir entre CTRL-A e CTRL-SHIFT-A ... Eu testei essas coisas no Konsole do KDE, que se comporta como um xterm, e no console do Linux.

    
por A. Donda 15.08.2013 / 16:34

1 resposta

4

Se você estiver usando xterm , poderá enviá-lo para enviar um CSI (0x9B) em vez da sequência \e[ definindo o recurso booleano eightBitControl. Por exemplo, inicie o xterm assim:

xterm -xrm '*eightBitControl:true'

Você pode definir esse recurso permanentemente editando o arquivo de recursos específico do aplicativo XTerm (o Ubuntu parece colocar isso em /etc/X11/app-defaults , mas acho que /usr/share/X11/app-defaults é mais padrão).

Mas esteja avisado: isso basicamente irá quebrar o seu terminal até você consertar todos os seus atalhos de teclado.

Quanto à questão mais geral, acho que é mais difícil do que parece à primeira vista. O console do Linux é muito bem projetado para gerar códigos de caracteres de oito bits (para que ele funcione com o UTF-8). A partir de um console real (ou seja, não usando X), você pode obter scancodes "brutos", mas você teria que fazer toda a lógica de mapeamento de teclado (que é o que o X faz, na verdade). Você pode usar os recursos de mapeamento de teclado X para gerar alguns códigos específicos para combinações de alt + ctrl + letra, mas não sei onde você os incluiria na sequência de codificação de oito bits. Eu sinto sua dor, no entanto:)

    
por 15.08.2013 / 18:38