blog.leny.me

Complétion en ligne de commande

Dans le cadre du développement de vibox, un petit programme en ligne de commande pour gérer les machines virtuelles locales de VirtualBox, j’ai voulu permettre l’utilisation de la touche <tab> pour la complétion sur les commandes, et, surtout, sur les noms de machines virtuelles.

J’ai trouvé très, très, peu d’infos claires sur le net, encore moins en français.
Donc je vais partager ma méthode, en espérant qu’elle puisse servir à d’autres.

Je suis développeur web. Bash et la ligne de commande, j’ai un peu appris ça tout seul. Donc si je n’utilise pas les bons mots, que les puristes me pardonnent.
Je préfère utiliser mes mots, au moins, je suis sûr de faire passer l’idée.

Complétion en ligne de commande, fonctionnement

Dans les grandes lignes, en bash, quand on appuie sur <tab>, l’interpréteur appelle un script qui retourne une liste de mots possibles dans le contexte, et enfin, selon les caractères déjà tapés, filtre les mots reçus pour n’afficher que les plus pertinents.
S’il n’y a plus qu’une proposition valide, alors le mot est complété.

Voilà pour le principe.

Mise en place

La mise en place d’un mécanisme de complétion se fait en 3 étapes :

  1. Le script qui liste les mots
  2. Le mécanisme de complétion
  3. L’installation

1. Listing des mots

Quel que soit le langage utilisé, vous devez retourner une liste de mots, séparés par des retours à la ligne (EOL).

Le mécanisme de complétion ne vous demande pas de faire le tri, il le fait lui-même, donc contentez-vous de lister les mots.

2. Mécanisme de complétion

Il vous faut maintenant créer un script bash qui va mettre en place le mécanisme.
Créez un fichier et collez le code suivant :

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
_complete() {
local word="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "$(my_prog --completion)" -- "$word") )
}
complete -F _complete my_prog

Il vous faut bien sûr remplacer my_prog par le nom de votre programme.

Donc, dans l’exemple, my_prog —completion est la commande qui retourne la liste de mot, à vous de la remplacer par celle de votre programme.

3. Installation

La dernière étape, c’est d’ajouter dans votre profil une commande pour indiquer que notre programme utilise l’autocomplétion.

Modifiez votre fichier .bashrc ou .profile et ajoutez-y la ligne suivante :

1
which myprog > /dev/null && . /path/to/myprog_completion

Remplacez myprog par le nom de votre programme, et /path/to/myprog_completion par le chemin vers le fichier créé à l’étape 2.

Redémarrez votre terminal, et tout devrait être ok.

Pour aller plus loin…

Il y a bien sûr toujours moyen d’aller plus loin, par exemple en retournant une liste de mots différente en fonction du nombre de commandes et sous-commandes entrées, etc…

Pour creuser un peu plus, vous pouvez regarder le code de vibox, ou celui de Grunt, par exemple.

C’est toujours la meilleure façon d’apprendre de nouvelles choses.

leny

Il n'y a pas de module de commentaires sur ce blog, principalement pour éviter à devoir gérer avec les spams, la pub, les insultes, ...

Toutefois, si vous avez quelque chose à dire/corriger/modifier, ou simplement exprimer votre opinion sur un post, n'hésitez pas à me contacter sur Twitter (@leny_be).