Par exemple:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
Je ne connais que des bric-à-brac, comme des \e
sillons 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?
bind -p
.Réponses:
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
readline
une 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^I
caractère également appeléTAB
ou\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éESC
ou\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 l
et de la saisir Entersur le clavier. Ensuite, vous verrez quelque chose comme:La première ligne est provoquée par le terminal local
echo
créé 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
,;
,5
etA
(0x1b 0x5b 0x31 0x3B 0x35 0x41)La
terminfo
base 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$TERM
valeur).Par exemple:
Vous dirait quelle séquence d'échappement est envoyée en
rxvt
appuyant sur la Deletetouche.Vous pouvez rechercher quelle touche correspond à une séquence donnée avec votre terminal actuel avec
infocmp
(en supposant icincurses
infocmp):Les combinaisons de touches, par exemple, Ctrl-Upn'ont pas d'entrées correspondantes dans la
terminfo
base de données. Pour savoir ce qu'elles envoient, lisez le code source ou la documentation du terminal correspondant ou essayez-le avec lased -n l
méthode décrite ci-dessus.la source
\e-1\C-i
est un onglet en arrière, carcontrol
eti
insère un onglet etescape
suivi de-1
dit bash pour le faire en arrière une fois (j'ai bafouillé cela et trouvé quelques trucs à propos dedigit-arguments
).$ sed -n 1
sed: -e expression #1, char 1: missing command
tput smkx
, votre terminal envoie\e[OD
(kcub1
) et aprèstput 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. Essayezstty -echoctl; tput rmkx; sleep inf
et vous verrez les touches fléchées déplacent le curseur en dehors du mode clavier ).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 .la source
\[A
se trouve dans le tableau "Codes CSI" de la rangée: "CSI n A"[Z
,[1;5C
ou-1
?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.
la source
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
^[Oa
et vous devrez traduire^[
dans\e
ou\033
ou\x1b
ou 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-insert
et, 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 rlcompleter
améliorations, comme l' amélioration de Python, utilisent également.Voici la description du manuel Readline :
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-q
liaison originale d’Emacs qu’en mode Vi, ce qui est assez paradoxal, maisC-v
il fonctionne toujours dans le mode d’entrée par défaut semblable à Emacs. (Recherchezquoted-insert
dans leszshzle
pages 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.
la source