Quelle est la méta-clé de bash?


16

J'ai essayé d'utiliser xmodmappour mapper META_Là la MENUclé, mais il ne semble pas être accepté par bashcomme clé méta. Je me demande donc comment ces composants (clavier, X, xterm, bash) sont liés à chacun en ce qui concerne les méta- et super-clés. Toute explication serait appréciée.

Permettez-moi d'exprimer ceci d'une autre manière. La page de manuel bash indique, par exemple, que la fonction yank-nth-arg est liée à M-C-yet qu'elle fonctionne lorsque j'appuie sur Esc-Control-y. Mais je trouve cela un peu lourd. Alors, comment puis-je faire en sorte que bash accepte une autre clé comme Meta(comme le Menu) pour toutes ses liaisons par défaut?


Votre MENUclé est-elle même remarquée par X? Quel gestionnaire de fenêtres utilisez-vous - certains d'entre eux peuvent vous aider à redéfinir vos clés.
choroba

Réponses:


11

Le mappage des touches du clavier aux modificateurs comme Metaet Controlest géré par le serveur X (c'est-à-dire la partie de bas niveau de l'interface graphique). Ce mappage peut être manipulé via la xmodmapcommande à l'ancienne ou le nouveau style interface XKB de , ou via des outils de configuration GUI qui utilisent l'un d'eux sous le capot.

Par défaut, sur la plupart des configurations, la Metaclé est la clé étiquetée Alt. En effet, historiquement, de nombreux postes de travail Unix avaient une clé étiquetée Metalà où les PC ont une clé étiquetée Alt. Donc, si vous avez une liaison pour M-C-y, appuyez sur Ctrl+ Alt+Y .

Pour vérifier quelles sont vos liaisons actuelles, démarrez le xev programme dans un terminal. Avec la fenêtre xev focalisée, appuyez sur les touches; vous verrez une transcription des événements générés dans le terminal.

La communication entre les émulateurs de terminaux (ou dispositifs terminaux correspondant à des terminaux physiques) et les applications utilise des caractères. Lorsque vous appuyez sur A, le terminal reçoit les informations « Atouche, aucun modificateur», mais ce qu'il envoie à l'application en cours d'exécution dans le terminal est le caractère a. Lorsque vous appuyez sur une touche de fonction comme Upou F1, il n'y a pas de caractère correspondant; le terminal envoie une séquence de caractères commençant par le caractère d'échappement (octet 27, parfois écrit \eou ^[). Lorsqu'un émulateur de terminal tel que xterm a reçu un événement de pression de touche avec le Metamodificateur, il traduit cette clé en caractère d'échappement suivi de la fonction sous-jacente de la touche, par exemple \ea(d'échappement, minuscule a) lorsque vous appuyez sur Meta+A .

Quelle est la différence exacte entre un «terminal», un «shell», un «tty» et une «console»? peut être utile.


5

L'événement clé est généré par le serveur X (tel que configuré par xmodmap ) et envoyé à votre application X. Votre gestionnaire de fenêtres pourrait intercepter cela avant qu'il ne soit envoyé à xterm. XTerm, à son tour, traduit l'événement en quelques octets et envoie les octets au pseudo-tty alloué par votre shell, bash.

Veuillez noter que tous les événements ne sont pas traduits directement en octets par XTerm. Par exemple, les touches Ctrlet shift, par elles-mêmes, génèrent des événements de clavier X, mais XTerm n'envoie rien au shell (ou à une autre application) qui y est exécuté. Cela inclut également la Metaclé seule, mais pas la Menuclé. Cependant, l'événement généré en appuyant sur Meta- eobligera XTerm à envoyer l'octet 0xE5 ou la séquence à deux octets 0x1B 0x65, selon le paramètre de ressource XTerm.VT100.metaSendsEscape.


2

La méta-clé de Bash était à l'origine définie comme ceci ( lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

Cela se trouve être la façon dont il est interprété avec ncurses et xterm . A quelques bornes prévues pour faire cette fonctionnalité en option (cet aspect n'a pas été répandue La plupart des terminaux vous rencontrerez l' utilisation des comportements hardcoded (et pas très intéressant) Les.. Terminfo documents page de manuel ces capacités du terminal:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

et explique la fonctionnalité:

Si le terminal possède 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.

Une fonctionnalité différente, préfixant un caractère d'échappement en réponse à la Altclé, a été intégrée dans certains émulateurs de terminal. Bash (en fait la readlinebibliothèque) documente cette utilisation dans son journal des modifications de 2004:

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

La méta est un cas particulier d'une touche de modification . Comme controletshift , vous appuyez dessus en même temps qu'une autre touche et vous attendez à voir quelque chose de différent que d'appuyer sur la touche seule. X fournit des touches de modification en affectant un bit à la valeur de modification transmise lors de l'événement X pour la touche. Les pressions sur les touches peuvent être de multiples événements X; X fournit des fonctions pour combiner ces événements tout en conservant les modificateurs.

X définit également des symboles pour chacune des touches pouvant apparaître sur votre clavier. Il fournit d'autres valeurs (comme Unicode) par une manipulation spéciale dans les fonctions qui combinent les événements.

Mais "meta" est un cas particulier.

Les applications X n'ont pas de metaclé, sauf par convention. X n'a ​​pas de définition pour la touche méta ou le modificateur méta. Classiquement, les terminaux recherchent la Alttouche et / ou l' un des modificateurs connus xmodmap, par exemple mod2. La dernière fonctionnalité xkb complique les choses (mais n'apporte aucune amélioration par rapport à cette discussion) en fournissant une autre couche d'informations pour trouver la Altclé.

La convention ne peut bien sûr vous emmener que si loin, étant donné que ni xmodmapni xkbrien en particulier sur les méta . xterm, par exemple, est configurable et tous les utilisateurs ne souhaitent pas configurer la méta de la même manière. Par exemple, Altpeut ne pas être la méta-clé voulue, par exemple, si elle est utilisée dans la translationressource. Une autre clé peut être la méta-clé, mais les utilisateurs (en particulier ceux qui utilisent des séquences d'échappement dans bash) peuvent vouloir qu'un caractère d'échappement soit envoyé lorsqu'ils appuient Alt. Mais gardez à l'esprit qu'à moins qu'il ne soit configuré comme modificateur, rien de tout cela ne se produit: xterm ne combine pas les événements par lui-même.

xterm possède plusieurs paramètres de ressources (documentés dans la page de manuel ):

  • altIsNotMetaet altSendsEscape(ajouté en 2007 ).
  • eightBitInputdepuis 2006 correspond au sens original du méta-mode, et il y a une séquence d'échappement définie pour cela qui fournit les capacités terminales smmet rmm(définir / supprimer le méta-mode).
  • eightBitInputa été modifié en 2003 pour prendre en compte l'UTF-8 en décalant les valeurs Unicode décodées de 128 plutôt que les octets d'entrée bruts.
  • metaSendsEscapedate de 1999
  • eightBitInputest beaucoup plus âgé que metaSendsEscape. Cela a implémenté un choix entre le mode méta (ajout du huitième bit) ou le préfixe d'une clé escapedepuis X11R4 (1989). Mais la fonctionnalité a été déterminée au démarrage: elle a été vérifiée lors de l'initialisation pour déterminer si l'entrée a été définie pour autoriser 8 bits ou seulement 7. Après cela, elle n'a pas changé.

Certaines personnes assimilent les deux ( 8e bit et préfixe d'échappement), faisant référence à ce dernier comme mode méta . Selon votre point de vue sur la question, le eightBitInputréglage des ressources de xterm fait partie de la solution pour obtenir une méta-clé fonctionnelle.

Lectures complémentaires:

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.