A conversão de certos pressionamentos de tecla em um sinal é realizada em um nível muito baixo: é feita pelo driver de terminal genérico no kernel, quando transmite entre o processo do emulador de terminal ou o hardware do terminal físico e o programa em execução no terminal. Este driver só entende caracteres (e por caracteres, quero dizer bytes - quando essas interfaces foram projetadas, conjuntos de caracteres multibyte não eram uma coisa).
A maioria das teclas que envolvem modificadores diferentes de Shift ou envolvendo teclas de função não têm caracteres correspondentes, portanto o terminal deve enviar uma sequência de escape de caracteres múltiplos (começando com o ASCII escape character ). Veja bash - ligações de sequências de chaves erradas com control + alt + espaço e Como funciona a entrada de teclado e a saída de texto para mais informações sobre este assunto.
Existem caracteres correspondentes à Ctrl + letra (os caracteres de controle ASCII ), mas não para Super + letra . Meta + C envia a sequência de dois caracteres ESC
C
e Super + C envia apenas C
por padrão na maioria dos terminais. Assim, você pode religar os sinais na Ctrl + letra (e alguns símbolos de pontuação), para um caractere imprimível de byte único, e é sobre isso (também para um não- Byte ASCII, mas isso causaria estragos em UTF-8).
A única solução é configurar o emulador de terminal para enviar Ctrl + C para qualquer tecla que você queira fazer disparar o SIGINT. Para Rxvt, você está no caminho certo, mas ^C
insere os dois caracteres ^
e C
, você precisa do caractere control-c, que pode ser especificado com um escape octal. Além disso M-c
é Meta + C , não Super + C ; para Super + C , execute xmodmap -pm
, observe qual mod1
a mod5
é Super e use o dígito correspondente como o caractere modificador, por exemplo
URxvt.keysym.5-c: URxvt.keysym.5-c: %pre%3
3