Pourquoi Ctrl + m et Ctrl + q ne sont-ils pas utilisés dans les raccourcis bash?

Récemment, j'ai passé en revue les keys de raccourcis bash, et en essayant de find un approprié pour ma key d'activation tmux.

Je trouve intéressant que ctrl + m et ctrl + q ne soient pas utilisés dans les raccourcis bash, selon https://en.wikipedia.org/wiki/Bash_(Unix_shell) .

Pourquoi ils ne sont pas utilisés? Je me sens ctrl + m est très pratique.

Est-ce que ces deux combinaisons sont conçues par le design pour l'utilisation de DIY (define it yourself) ? Ou il y a une autre histoire?

Ctrl + M envoie le même caractère (RET) que la touche Entrée du terminal. Les programmes n'ont aucun moyen de les distinguer, donc ces keys ne peuvent pas être configurées séparément.

Ctrl + Q est déjà utilisé pour XON par défaut, il ne peut donc pas être utilisé par Bash, mais vous devriez toujours pouvoir l'utiliser dans tmux, car tmux utilise le mode d'input brut.

Un programme graphique peut lire à partir du keyboard, que Key a été pressé avec le modificateur Ctrl et utiliser Ctrl + m comme raccourci, mais un shell ou n'importe quel programme terminal reçoit les combinaisons Ctrl + Key comme des caractères ascii de 0 à 26

 Ctrl+@ = 0 Ctrl+A = 1 Ctrl+B = 2 

etc. Vous pouvez essayer ceci pour voir les valeurs

 cat ctrlkeys <<EOF ^A^B^C^D^E^F EOF od -c ctrlkeys 0000000 001 002 003 004 005 006 \n 

Pour entrer les valeurs, appuyez sur Ctrl + v avant Ctrl + [af] pour les get non interprétées en tant que valeur brute.

Lorsque vous regardez la table ascii (7), vous pouvez voir les codes de contrôle dans une table avec les caractères correspondants @ .. Z sur la gauche. Par exemple

 015 13 0D CR '\r' (carriage ret) 115 77 4D M 

ou

 011 9 09 HT '\t' (horizontal tab) 111 73 49 I 

La couche suivante qui interprète les codes de contrôle avant bash est stty (changez et imprimez les parameters du terminal)

 stty -a intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; 

voir stty (1) pour les significations de lnext ou start et stop .

Voir aussi readline (3) comme bash et d'autres programmes cli GNU utilisent cette bibliothèque pour contrôler les lignes d'input et bien sûr bash (1) / READLINE, la section readline de la page de manuel bash.

Note: XYZ (NUM) signifie la page de manuel XYZ de la section NUM, donc le résultat de l' man NUM XYZ .