Page suivante   Page précédente Table des matières  

1. Comment créer des raccourcis-clavier sur les consoles Linux --ou-- Pourquoi Bill Gates n'aura mon clavier qu'en l'arrachant de mes mains raidies par la mort.

By Bryan Henderson

1.1 Introduction

Je suis un adepte de la ligne de commande. Je sais bien que sur les Linuxettes de maintenant, je peux arpenter le monde à grands coups de clics comme si j'étais illettré, ou un Windowsien, mais je me sens plus à mon aise dans une console virtuelle sous Linux avec mon invite de Bash. J'ai utilisé Linux avec bonheur pendant deux ans avant d'installer X pour la première fois (ce que je n'ai fait que quand le Web en est arrivé à être inutilisable sans un navigateur graphique). J'avais l'habitude de laisser ma souris par terre.

Mais bon, dans certains cas, taper des commandes est réellement pénible, comme quand il s'agit de lire son courrier vingt fois par jour. Les abominables commandes Unix sur deux caractères, les alias, et le complètement de mots ne peuvent que soulager ce fardeau qu'est la frappe. Du coup, j'ai fait en sorte que ma touche F2 m'apporte le courrier par la simple pression d'un doigt. F1 me permet d'éditer un fichier auquel je me réfère tout au long de la journée. D'autres touches envoient des chaînes d'options et des noms de fichiers et de répertoires que j'utilise beaucoup.

Je peux attribuer n'importe quelle commande ou partie de commande à n'importe quelle touche du clavier, et avec les bascules Alt et Control, ce pavé numérique sans intérêt, sans parler des touches de fonction, je n'ai que l'embarras du choix.

Si vous ne savez pas comment faire, lisez ce qui suit ; ce n'est pas difficile. Mais il va falloir d'abord que j'expose quelques bases à propos du clavier.

1.2 Les bases - Comment des frappes de touches deviennent commande

Je n'ai jamais utilisé qu'un clavier standard IBM branché sur un ordinateur de type PC, et quelques uns des détails rugueux ci-après peuvent ne pas être applicables chez vous. Mais je sais que les techniques de base fonctionnent sur tout clavier Linux.

Bash récupère toutes ses commandes (par "commande" j'entends votre réponse à son invite) via la bibliothèque GNU Readline. Elle consiste en des sous-routines auxquelles n'importe quel programme peut faire appel pour obtenir une ligne d'entrée depuis le clavier. L'avantage pour un programme d'utiliser Readline au lieu de se contenter d'une simple opération de lecture de fichier depuis le terminal est que le code de Readline permet à l'utilisateur de s'amuser à éditer la ligne et de procéder à toute une série de tours de magie afin de la formater à sa guise avant que Readline ne passe le relais au programme appelant. Toutes ces opérations d'édition que vous effectuez sur la ligne de commande à l'invite de Bash, telles que l'effacement arrière (backspace), la suppression d'un mot, le rappel de l'historique, et l'insertion, ne sont pas l'oeuvre de Bash lui-même, mais des sous-routines de Readline qu'il appelle.

Bash (également un produit GNU) est l'utilisateur originel de Readline et on tend à lui attribuer tout le crédit pour ces fonctions d'édition de ligne élaborées (il y en a à peu près soixante), et en fait, elles sont décrites dans la page de man de Bash. (Et puis pourquoi pas ? Après tout, des millions d'utilisateurs croient bien qu'amazon.com fait partie d'AOL). Mais Bash se contente d'appeler des routines de la bibliothèque Readline, tout comme beaucoup d'autres programmes, ce qui leur donne les mêmes capacités d'édition de ligne. Par exemple, Gdb et le frontal SQL de Postgresql (Psql), ainsi que quelques clients Ftp.

Readline récupère un flux de caractères depuis le terminal (et cela peut être n'importe quel vieux modèle, pas uniquement une console virtuelle sous Linux) et est capable de reconnaître certaines séquences et d'exécuter certaines fonctions quand il en détecte. Par exemple, quand il voit E, il insère E dans la ligne en cours de création. Quand il voit Control-A, il remonte le curseur jusqu'au début de la ligne. Quand c'est Tab, il lit dans vos pensées (enfin, c'est ce que je crois).

Vous pouvez déterminer ce que fait Readline lorsqu'il détecte une suite de caractères particulière par l'entremise d'un fichier de configuration, normalement appelé .inputrc, et situé dans votre répertoire d'accueil.

1.3 Création d'un raccourci-clavier

La fonction de Readline que nous allons utiliser est celle qui permet d'insérer une chaîne dans la ligne courante. Pour simplifier le premier exemple, nous nous contenterons de faire un truc complètement ridicule :  assigner la chaîne ps -a --forest au caractère z. Une fois ceci fait, nous ne pourrons plus taper de lettre z dans aucune commande, d'où le côté réellement ridicule.

Pour ce faire, il suffit d'ajouter ce qui suit au fichier ~/.inputrc (s'il n'existe pas déjà, il suffit de placer cette ligne toute seule dans un fichier créé pour l'occasion) :

"z":"ps -a --forest"

La manière la plus simple de faire prendre effet à cette association est de se déloguer puis de se reloguer.

Après ceci, vous remarquerez qu'à chaque fois que vous pressez la touche z, les caractères ps -a --forest apparaissent dans le tampon de votre ligne de commande. Tapez Entrée et la commande ps sera exécutée. Vous noterez aussi que vous n'avez pas à taper z au début de la ligne. Entrez echo z et vous avez tapé echo ps -a --forest.

Mais soyons plus sensés et assignons cette commande ps à la touche F1. Cela s'avère légèrement plus compliqué car l'appui sur cette touche provoque non pas l'envoi d'un simple caractère imprimable vers Readline, mais celui d'une séquence de caractères dépendant du type de terminal. Concentrons nous sur la console Linux, en particulier une qui utilise les paramètres de configuration par défaut. Dans ce cas, F1 envoit les quatre carcatères Escape, [, [, et A.

Mais ne me croyez pas sur parole. Vous pouvez vous en assurer grâce à la fonction de Readline quoted-insert, que vous devriez trouver associée à Control-V. Elle a pour effet de placer dans la ligne le caractère qui suit, au lieu d'exécuter toute fonction qui pourrait lui être assignée. C'est nécessaire afin d'empêcher Readline d'interprêter ce caractère Escape. De ce fait, à l'invite de Bash, tapez Control-V puis F1. Lorsque Readline placera Escape et les trois autres caractères à sa suite dans la ligne d'entrée, il en enverra l'écho habituel pour que vous puissiez les voir. Le caractère d'échappement apparaît probablement sous la forme de ^[, c'est-à-dire Control-[, une autre appellation de Escape. Ce truc est la façon la plus simple de déterminer exactement les séquences engendrées par à peu près n'importe quelle touche de votre clavier.

Une fois que nous savons que F1 envoit Escape-[-[-A, il nous suffit de le mettre dans ~/.inputrc. Mettre un caractère Escape dans un fichier n'est jamais élégant, quel que soit l'éditeur. Readline vous y aide en acceptant que \e dans le fichier de configuration le représente. Par conséquent, remplacez cette assignation de z décrite plus haut par celle qui suit dans ~/.inputrc :

"\e[[A":"ps -a --forest"

A présent, si vous êtes partant pour quelque chose de plus élaboré que se déloguer pour revenir aussitôt, tapez simplement Control-X Control-R. Cela devrait provoquer le rechargement du fichier de configuration de Readline. Pressez maintenant F1 et vous aurez ps -a --forest.

Mais devoir faire Entrée après F1 gâche tout. Cela revient à se lever pour aller chercher la télécommande du magnétoscope.

Tout ce qui suit les deux points (:) est appelé une macro (si ce n'était pas entre guillemets, ce serait une fonction, comme end-of-line). Readline traite chaque caractère de la chaîne comme si vous l'aviez tapé. Alors que jusqu'à présent, nous n'avons employé que des caractères devant s'insérer dans la ligne d'édition (p, s, etc.), nous pouvons aussi en utiliser qui font des choses plus exotiques. parmi ceux-ci, le Retour Chariot (vous vous souvenez des machines à écrire, n'est-ce pas ?), qui est ce que votre terminal envoit quand vous appuyez sur la touche Entrée.

Comme on le connaît aussi en tant que Control-M, vous pouvez avoir recours à la notation spéciale de Readline "\C-M" pour le représenter. Ainsi, mettez ce qui suit dans votre fichier ~/.inputrc, rechargez, et vous constaterez que vous avez une commande ps en une seule touche.

"\e[[A":"ps -a --forest\C-M"

Voilà, c'est tout. Assignez la commande de votre choix à la touche de votre choix. Utilisez la technique du quoted-insert pour trouver quelles séquences sont associées avec vos touches de fonction et votre pavé numérique. Faites attention que ceux-ci ont des modes particuliers - et pas mal, même. Les séquences envoyées par les touches diffèrent selon le mode du pavé.

Pour les touches modifiées par Alt et Control, employez la syntaxe C-x et M-x dans ~/.inputrc (M correspond à Meta, un précurseur de la touche Alt).

Voyez le Guide Utilisateur de Readline, disponible là où tous les beaux documents Info sont hyperliés sur votre système, pour les détails. La page de man sur la sous-routine Readline est également valable.

1.4 Ce qui ne marche pas

A présent, je voudrais mettre l'accent sur des choses qui ne fonctionneront pas comme vous l'attendrez car votre frappe sera interprêtée à un niveau inférieur à Readline.

Tout d'abord, le pilote de périphérique tty (il est situé un niveau au-dessus de celui du clavier) reconnait quelques caractères spéciaux, sous le contrôle du programme stty. Readline élimine la plupart de ces interférences de tty en plaçant la console en mode tty brut ("raw"), mais il est peu probable que Control-S, Control-Q, Control-C, et Control-Z arrivent jamais jusqu'à Readline, étant subtilisés au passage et traités comme il se doit par le pilote tty.

Ensuite, il y a le pilote du clavier. Il vous permet de personnaliser chaque touche, mais pas au même niveau que Readline, s'entend. Vous pouvez faire en sorte que la touche Shift de gauche génère le caractère q si vous vous sentez un peu psychotique. Plus important, le pilote du clavier assigne certaines fonctions de la console à certaines combinaisons de touches, ce qui veut dire que celles-ci n'engendreront jamais rien qui sera envoyé d'abord au pilote tty, puis à Readline. Par exemple, le pilote associe normalement Alt-F1 avec "basculer vers la console virtuelle 1". Par conséquent, il est inutile d'essayer de programmer Readline de façon à insérer le nom de votre répertoire Napster de musique piratée lorsque vous tapez Alt-F1.

Sous X, (disons, dans un xterm), le pilote de clavier Linux est largement court-circuité, le serveur X lui substituant le sien propre. Du coup, les touches ne retourneront pas forcément le même flux de caractères à destination de Readline, ainsi que ce serait le cas dans une console virtuelle standard.

1.5 Plus de détails

Si le vaste monde de l'habillage de clavier vous intéresse, vous pouvez partir du Keyboard-And-Console HOWTO, lire le Guide Utilisateur de Readline et bien sûr la documentation de X.

Copyright 2000, Bryan Henderson. Paru dans le numéro 55 de la Linux Gazette de juillet 2000.

Traduction française de Joel SAGNES, le 23/08/2000.


Page suivante   Page précédente Table des matières