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

15

Récemment, j'ai passé en revue les clés de raccourcis bash et j'ai essayé de trouver une clé appropriée pour ma clé d'activation tmux.

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

Pourquoi ne sont-ils pas utilisés? Je pense que ctrl + mc'est assez pratique.

Ces deux combinaisons sont-elles conçues par la conception pour être DIY (define it yourself)utilisées? Ou il y a une autre histoire?

Zen
la source
1
L'utilisation ALT + mest encore plus pratique à mon humble avis.
Rolf

Réponses:

16

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

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

Un programme GUI pourrait lire à partir du clavier, que la touche m a été enfoncée avec le modificateur Ctrl et utiliser Ctrl + m comme raccourci, mais un shell ou tout autre programme terminal reçoit les combinaisons Ctrl + Touche 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 qu'elles ne soient pas interprétées comme une valeur brute.

Lorsque vous regardez le tableau ascii (7), vous pouvez voir les codes de contrôle dans un tableau 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 (modifiez et imprimez les paramètres 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 lnextou startet stop.

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

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

user4098326
la source
1
Bash a une liaison par défaut pour Cs (XOFF), ils auraient donc pu en mettre une aussi pour Cq.
Gilles 'SO- arrête d'être méchant'
En fait, par défaut, la bibliothèque GNU Readline que Bash utilise se lie C-qà la même chose C-vqu'un clone de la fonction Emacs quoted-insertqui est utile pour déterminer les codes d'échappement générés par les clés et les combinaisons de touches. Voici la partie pertinente du manuel Readline: tiswww.case.edu/php/chet/readline/readline.html#SEC9
ssokolow