Quels sont les caractères imprimés lorsque vous appuyez sur les touches Alt + Flèche?

13

Lorsque j'appuie AltUp, Aimprimé sur l'écran du terminal. La même chose s'est produite lorsque j'ai appuyé AltDownmais Best imprimée à la place.

D'autres personnages que j'ai réalisé;

AltLeft= Det AltRight=C

Quel est le but de ces commandes?

yfklon
la source

Réponses:

14

Selon la configuration du terminal, la saisie Alt+Keyrevient à taper les touches Escet Keydans l'ordre, elle envoie donc le caractère ESC (alias \eou ^[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[Aou \033OAselon 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 fooune 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 zshou vilit 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 ( kcuu1capacité) que c'est la séquence d'échappement envoyée lors de la pression Up.

Maintenant, pour Alt-Up, certains terminaux comme rxvtet ses dérivés comme etermenvoi \033suivi par la séquence d'échappement pour Up(qui est \033\033[Aou \033\033OA), tandis que d'autres comme xtermou gnome-terminalont 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;3Asur 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[Aou \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. bashpar exemple, interprètera \033[1;3comme 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[1donc il sautera cela, et lira le reste: ;3Aet l'insérera dans l'éditeur de ligne.

De nombreuses applications comme vi, zshou readlinebasées comme gdbou bash(bien que méfiez-vous bashutilise 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.

Stéphane Chazelas
la source
3

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 [[Bvaleurs. 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"

[1;3Cest 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

Nykakin
la source
3

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, bashs'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 comme smmet rmm.

bashle 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' xtermintroduction 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 xtermdescription 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:

  1. analyser complètement la séquence de caractères
  2. analyser en partie et jeter le controlmodificateur s'il n'est pas nécessaire
  3. il suffit de comparer la séquence de caractères avec un dictionnaire, dans l'espoir de déterminer le sens de cette façon.

Peu de programmes feraient le premier; certains éditeurs de texte feraient la deuxième ( en fait, je l' ai fait cela pour dedles fin des années 1980 ). Les développeurs d'applications telles que ont bashchoisi 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. xtermfait cela pour la fonction tcap-query , fournissant vimles affectations de touches de fonction réelles.

Puisqu'aucune des chaînes qui se bashcompare à 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:

Thomas Dickey
la source