Réponses:
Selon la configuration du terminal, la saisie Alt+Keyrevient à taper les touches Escet Keydans l'ordre, elle envoie donc le caractère ESC (alias \e
ou ^[
ou \033
) suivi du caractère ou de la séquence de caractères envoyés en appuyant dessus Key.
En appuyant sur Up, la plupart des émulateurs de terminal envoient les trois caractères \033[A
ou \033OA
selon qu'ils sont en mode clavier d'application ou non.
La première correspond à la séquence d'échappement qui, lorsqu'elle est envoyée au terminal, déplace le curseur vers le haut. Si tu fais:
printf '\nfoo\033[Abar\n\n'
Vous verrez bar
écrit après foo
une rangée. Si tu fais:
stty -echoctl; tput rmkx; read foo
Vous verrez que les touches fléchées déplacent le curseur.
Lorsqu'une application aime zsh
ou vi
lit cette séquence de caractères à partir du terminal, elle l'interprète comme l'action "Up", car elle sait depuis la base de données terminfo ( kcuu1
capacité) que c'est la séquence d'échappement envoyée lors de la pression Up.
Maintenant, pour Alt-Up, certains terminaux comme rxvt
et ses dérivés comme eterm
envoi \033
suivi par la séquence d'échappement pour Up(qui est \033\033[A
ou \033\033OA
), tandis que d'autres comme xterm
ou gnome-terminal
ont des séquences d'échappement séparées pour ces types de clés lorsqu'il est utilisé avec les touches de combinaison comme Alt, Shift, Ctrl.
Ceux - ci généralement envoyer \033[1;3A
sur Alt-Up.
Lorsqu'elle est envoyée au terminal, cette séquence déplace également le curseur vers le haut (le deuxième paramètre (3) est ignoré). Il n'y a pas de touche de clavier correspondante , il s'agit donc de la même séquence envoyée Alt-Upen mode clavier de l' application ou hors de celui-ci .
Maintenant, que ce soit \033\033[A
ou \033[1;3A
, de nombreuses applications ne savent pas à quoi servent ces séquences. La base de données terminfo ne les aidera pas, car il n'y a pas une telle capacité qui définit quels caractères ces combinaisons de touches envoient.
Ils feront de leur mieux pour interpréter cette séquence. bash
par exemple, interprètera \033[1;3
comme une séquence d'échappement, ne sait rien à ce sujet, tout comme rien, suivi de A
. zsh
, arrêtera la lecture dès qu'il découvrira qu'il n'y a pas de séquence de caractères correspondante connue. Il n'y a pas de séquence d'échappement qu'il sait qui commence par \033[1
donc il sautera cela, et lira le reste: ;3A
et l'insérera dans l'éditeur de ligne.
De nombreuses applications comme vi
, zsh
ou readline
basées comme gdb
ou bash
(bien que méfiez-vous bash
utilise une version modifiée de readline
) vous permettent d'ajouter des liaisons pour n'importe quelle séquence de caractères.
Par exemple, dans zsh
, vous pouvez vouloir lier Alt-Up, Alt-Downcomme:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
Celles-ci consistent à rechercher l'historique en arrière et en avant pour les lignes de commande qui commencent comme l'actuelle jusqu'à la position actuelle du curseur, ce qui est assez pratique pour rappeler les commandes précédentes.
Vous pouvez utiliser Crtl+ vpour renvoyer les codes d'entrée de votre clavier. Si vous le faites pour les touches fléchées, vous obtiendrez [[D^
, [[C^
, [[A^
et les [[B
valeurs. Il n'y a pas de liaisons par défaut pour les Alttouches fléchées +, il semble donc que l'action effectuée consiste à imprimer le code lettre seul. Cependant, si vous créez votre version locale du fichier de configuration de la bibliothèque readline:
$ cp /etc/inputrc ~/.inputrc
Et ajoutez une ligne:
"\e[1;3C": "sometexthere"
Où [1;3C
est le code d'entrée de Alt+ →(vous pouvez l'obtenir de la même manière qu'avant d'utiliser le raccourci Crtl+ v) et redémarrez votre terminal, puis le raccourci Crtl+ →vous renverra le texte "quelque part" et les autres Altraccourcis + flèches arrêteront de renvoyer des caractères.
Au lieu de cela, du texte, vous pouvez passer une commande pouvant être liée à partir de http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands comme
"\e[1;3C": unix-line-discard
pour avoir le même effet que Crtl+ u(supprimer la ligne).
Plus d'informations ici: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html
La Alttouche est souvent utilisée comme méta- modificateur. Les touches de curseur et de fonction sont appelées touches spéciales car elles peuvent envoyer plusieurs caractères - et les caractères envoyés peuvent être modifiés.
Certains utilisateurs, par exemple, bash
s'attendent à ce que le fait d'appuyer Altenvoie une touche préfixée par le caractère d'échappement. La fonction "méta" documentée (voir terminfo(5)
) traite du huitième bit:
Si le terminal a une "méta-clé" qui agit comme une touche Maj, définissant le 8ème bit de n'importe quel caractère transmis, ce fait peut être indiqué par
km
. Sinon, le logiciel supposera que le 8ème bit est la parité et il sera généralement effacé. Si des chaînes existent pour activer et désactiver ce "mode méta" , elles peuvent être données commesmm
etrmm
.
bash
le sait aussi (voir la FAQ ncurses ), mais peu de ses utilisateurs sont intéressés par la fonctionnalité. Néanmoins, ils sont habitués à se référer à Alt"méta", même si le mode méta est désactivé. Rxvt et xterm ont tous deux cette fonctionnalité depuis (au moins) le début des années 1990.
D'autres utilisateurs (depuis l' xterm
introduction de la fonctionnalité dans le patch # 94, 1999 ) peuvent s'attendre à ce que les informations de modificateur soient codées en tant que paramètre dans la séquence de caractères qu'une clé spéciale enverra. La documentation de XTerm désignait ces touches modifiées comme des touches de fonction "de style PC" pour les distinguer du "style VT220" (qui n'avait pas de modificateurs). Une touche de curseur non modifiée peut être envoyée ESC[A, mais il est également légal d'avoir un paramètre , par exemple, ESC[5Aqu'une application doit comprendre comme répétant cela cinq fois. La première version des touches de style PC de xterm
' utilisé ce "5" pour désignercontrolet une version ultérieure l'a modifié pour éviter toute confusion avec le nombre de répétitions. Donc...
ESC[5A
suggère que l'application déplace le curseur de 5 lignes vers le haut,
ESC[1;5A
suggère de remonter d'une ligne, indiquant à l'application qu'une controltouche a été enfoncée.
Les combinaisons utiles se trouvent dans la base de données ncurses terminfo depuis 2004 :
# 2004-07-17
# * add xterm-pc-fkeys -TD
La base de données terminfo montre la version actuelle de xterm + pcfkeys avec un commentaire montrant comment les modificateurs sont encodés:
# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
# Code Modifiers
# ---------------------------------
# 2 Shift
# 3 Alt
# 4 Shift + Alt
# 5 Control
# 6 Shift + Control
# 7 Alt + Control
# 8 Shift + Alt + Control
# ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.
(Alt et meta ne sont pas nécessairement la même clé). Il s'agit d'un bloc de construction (à son tour composé d'autres blocs de construction) à partir duquel la xterm
description du terminal est formée. Il utilise une extension fournie dans ncurses depuis 1999 qui permet des noms définis par l'utilisateur. Comme termcap ne prend en charge que les noms à 2 caractères et les descriptions à 1023 octets, il n'y avait aucune raison de rendre ces noms étendus disponibles via l' interface termcap . Ils sont facilement accessibles aux applications utilisant l' interface terminfo .
Maintenant vient une difficulté: il existe plusieurs façons pour une application de déterminer ce qu'une séquence de touches comme celle-ci représente:
Peu de programmes feraient le premier; certains éditeurs de texte feraient la deuxième ( en fait, je l' ai fait cela pour ded
les fin des années 1980 ). Les développeurs d'applications telles que ont bash
choisi la troisième voie en supposant que la plupart des informations se trouvent dans termcap . Alternativement, ils auraient pu choisir de faire un tableau avec des informations termcap / terminfo et utiliser l'interface qui a donné les meilleures informations. xterm
fait cela pour la fonction tcap-query , fournissant vim
les affectations de touches de fonction réelles.
Puisqu'aucune des chaînes qui se bash
compare à ne correspond aux chaînes qu'il reçoit, il peut être confus, se contentant de correspondances partielles (comme le caractère d'échappement par lui-même).
Lectures complémentaires: