Où puis-je trouver une liste des codes de clé de terminal pour remapper les raccourcis dans bash?

42

Par exemple:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Je ne connais que des bric-à-brac, comme des \esillons pour évasion et C-pour Ctrl, mais que sont ces chiffres ( 1) et ces lettres ( Z)? Quels sont les ;, [et les -panneaux?

Y at-il seulement des essais et des erreurs, ou existe-t-il une liste complète des codes de clé bash et une explication de leur syntaxe?

punaise
la source
2
Une astuce supplémentaire pour répertorier les liaisons readline réelles du shell est bind -p.
1
La plupart de ces codes sont interprétés par votre terminal; Consultez les codes d'échappement ANSI sur Wikipedia pour consulter une liste volumineuse.
Chepner
stty -a affiche les paramètres de ligne du terminal
bug

Réponses:

52

Ce sont des séquences de caractères envoyées par votre terminal lorsque vous appuyez sur une touche donnée. Rien à voir avec bash ou readline en tant que tel, mais vous voudrez savoir quelle séquence de caractères envoie une touche ou une combinaison de touches donnée si vous souhaitez configurer readlineune action sur une touche donnée.

Lorsque vous appuyez sur la Atouche, les terminaux envoient généralement le caractère a(0x61). Si vous appuyez sur <Ctrl-I>ou <Tab>, envoyez généralement le ^Icaractère également appelé TABou \t(0x9). La plupart des touches de fonction et de navigation envoient généralement une séquence de caractères commençant par ^[(control- [), également appelé ESCou \e(0x1b, 033 octal), mais la séquence exacte varie d'un terminal à l'autre.

La meilleure façon de savoir ce qu'une touche ou une combinaison de touches envoie pour votre terminal est de l'exécuter sed -n let de la saisir Entersur le clavier. Ensuite, vous verrez quelque chose comme:

$ sed -n l
^[[1;5A
\033[1;5A$

La première ligne est provoquée par le terminal local echocréé par le terminal (elle peut ne pas être fiable car les paramètres du terminal pourraient l’affecter).

La deuxième ligne est sortie par sed. Le $ne doit pas être inclus, c'est seulement pour vous montrer où se trouve la fin de la ligne.

Au- dessus de cela signifie que Ctrl-Up(que j'ai pressé) envoyer les 6 caractères ESC, [, 1, ;, 5et A(0x1b 0x5b 0x31 0x3B 0x35 0x41)

La terminfobase de données enregistre un certain nombre de séquences pour un certain nombre de clés communes pour un certain nombre de terminaux (en fonction de la $TERMvaleur).

Par exemple:

TERM=rxvt tput kdch1 | sed -n l

Vous dirait quelle séquence d'échappement est envoyée en rxvtappuyant sur la Deletetouche.

Vous pouvez rechercher quelle touche correspond à une séquence donnée avec votre terminal actuel avec infocmp(en supposant ici ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Les combinaisons de touches, par exemple, Ctrl-Upn'ont pas d'entrées correspondantes dans la terminfobase de données. Pour savoir ce qu'elles envoient, lisez le code source ou la documentation du terminal correspondant ou essayez-le avec la sed -n lméthode décrite ci-dessus.

Stéphane Chazelas
la source
C'est une excellente explication, merci! Maintenant, tout se met en place, \e-1\C-iest un onglet en arrière, car controlet iinsère un onglet et escapesuivi de -1dit bash pour le faire en arrière une fois (j'ai bafouillé cela et trouvé quelques trucs à propos de digit-arguments).
bug
$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx
3
@vib. C'est la lettre minuscule pas le chiffre 1
Stéphane Chazelas
1
@ user367890, c'est le mode clavier . Vous constaterez probablement qu'après tput smkx, votre terminal envoie \e[OD( kcub1) et après tput rmkx, \e[D( cub1, le même code que la séquence qui déplace le curseur vers la gauche, de sorte que l' écho de ces touches déplace le curseur. Essayez stty -echoctl; tput rmkx; sleep infet vous verrez les touches fléchées déplacent le curseur en dehors du mode clavier ).
Stéphane Chazelas
1
@ user367890, d'après ce que Thomas (le responsable de ncurses and xterm) dit dans la réponse que vous liez, oui, cela devrait fonctionner. Le mode clavier ou le mode application se réfèrent à la même chose, donc (encore une fois, selon Thomas) les spécifications de clé dans la base de données terminfo sont pour quand smkx est activé.
Stéphane Chazelas
4

Il est fourni via la bibliothèque gnu readline. vous devriez regarder dans l' homme 3 readline pour connaître sa description.

On dirait que vous avez également besoin d'informations sur la signification des codes Escspe \[A. Vous pouvez trouver cette information dans l' article de code wikipedia ANSI esacape .

se ruer
la source
Cela n'explique pas mes exemples.
bug
On dirait que c'était un peu mal compris. Veuillez regarder la mise à jour de la réponse.
Rush
Il n'y a aucune information sur mes exemples spécifiques dans l'article. Une recherche de page pour "[A" ne retourna rien non plus.
bug
1
@bug s'il vous plaît lisez attentivement l'article. \[Ase trouve dans le tableau "Codes CSI" de la rangée: "CSI n A"
Message
Merci pointe, mais où trouver des explications sur [Z, [1;5Cou -1?
bug
3

Ces codes proviennent-ils de la même source? Le dernier ressemble à une liaison GNU readline. C'est ce que l'utilisateur envoie à une bash (voir la réponse de rush). Les deux premiers, cependant, ressemblent davantage à des séquences de contrôle terminales (même si le premier serait mal formé). C'est ce que bash ou un autre programme renvoie à l'émulateur de terminal afin de contrôler les mouvements du curseur, les couleurs du texte, etc.

Uwe
la source
J'ai trouvé que "\ e [1; 5C" était utilisé pour le mouvement de mot avant ctrl-flèche, et "\ e [Z" et "\ e-1 \ Ci" pour le menu complet en arrière dans d'autres tutoriels. Ils ont tous été utilisés dans le fichier .inputrc.
bug
OK, s’ils sont interprétés par readline, il doit exister un émulateur de terminal dans lequel ces séquences de contrôle sont liées à une combinaison de touches ctrl, alt et / ou shift avec des touches de fonction ou des touches de direction. (Je ne sais pas lequel.)
Uwe
0

Le moyen le plus simple que j'ai trouvé pour vérifier quelle séquence d'échappement est générée par une combinaison de touches ou de touches consiste à appuyer sur Ctrl+ vdans un terminal, puis sur la touche / le combo que vous souhaitez connaître.

Vous obtiendrez une séquence comme ^[Oaet vous devrez traduire ^[dans \eou \033ou \x1bou tout autre représentation votre système attend KeyBinding pour le caractère d'échappement.

Cela a commencé comme une fonction Emacs nommée quoted-insertet, comme les raccourcis clavier par défaut pour Bash et Zsh imitent Emacs, ils l’ont également copiée.

Bash l'obtient via la bibliothèque d'entrées GNU Readline que d'autres import rlcompleteraméliorations, comme l' amélioration de Python, utilisent également.

Voici la description du manuel Readline :

quoted-insert( C-qou C-v)

Ajoutez le caractère suivant tapé à la ligne. Voici comment insérer des séquences de touches comme C-qpar exemple.

Cela devrait fonctionner dans tout ce qui est basé sur GNU Readline.

Quant à Zsh, qui utilise sa propre alternative nommée ZLE, il n’honorera la C-qliaison originale d’Emacs qu’en mode Vi, ce qui est assez paradoxal, mais C-vil fonctionne toujours dans le mode d’entrée par défaut semblable à Emacs. (Recherchez quoted-insertdans les zshzlepages de manuel ou zshall` et la deuxième paire de résultats devrait répertorier les associations par défaut.)

Pour une mnémotechnique, je vous conseille de penser à Ctrl+ vque de le demander v erbatim.

ssokolow
la source