En effet, même si bash propose de base une complétion, elle est plutôt limitée et il faut donc utiliser un script complémentaire, connu sous le nom de bash completion, pour pouvoir travailler réellement confortablement.

Il est possible de trouver sur Internet tout un tas de tutoriaux pour installer la complétion améliorée de bash sous Mac OS X, mais ils font pour la plupart appel à un système de paquet.

Or, je n'utilise aucun d'eux car je n'en ai pas l'utilité et qu'en bon agiliste, je ne met en œuvre que le strict minimum qui m'est nécessaire pour travailler.

Et comme installer un gestionnaire de paquets me paraissait un tantinet exagéré pour obtenir la complétion dans bash, j'ai décidé de réaliser l'installation manuellement.

Il faut commencer par télécharger la dernière version de la complétion, via bien évidemment un terminal et l'instruction qui suite :

# curl -O http://bash-completion.alioth.debian.org/files/bash-completion-1.3.tar.bz2

En effet, avant d'être une extension de PHP très utile, cURL est surtout un client HTTP en ligne de commande, et en conséquence, il permet la récupération de fichiers stockés sur le web.

L'option -0 de curl permet de récupérer l'archive dans le répertoire courant dans un fichier portant le nom bash-completion-1.3.tar.bz2.

Il faut ensuite, toujours via le terminal, décompresser l'archive ainsi obtenue :

# tar xzpf !$:t

Les lecteurs avertis auront remarqué que le nom de l'archive à décompresser n'apparait pas dans la commande précédente.

Elle est en effet remplacée par la chaîne de caractères !$:t qui permet d'utiliser l'historique afin de ne pas avoir à la longue le bout des doigts carré en tapant plusieurs fois les mêmes choses.

Le symbole ! débute une substitution de l'historique, tandis que $ permet de récupérer le dernier argument de la dernière instruction exécutée et que :t permet de ne conserver que son nom de fichier final.

Il est à noter que suivant la valeur de l'option histverifybash vous permettra éventuellement de vérifier que la substitution s'est passée correctement en affichant l'instruction résultante, auquel cas vous devrez appuyer sur la touche ↵ de votre clavier pour exécuter effectivement la commande.

Une fois l'archive décompressée, il n'y a plus qu'à réaliser l'installation, en commençant par aller dans le répertoire contenant le code de la complétion via l'exécution de la commande suivante :

# cd !$:r:r

Encore une fois, la commande précédente fait appel à la substitution d'historique.

La chaîne de caractère !$ permet toujours de récupérer le dernier argument de la commande précédente, mais le modificateur :r le modifie deux fois en lui retirant successivement les extensions .bz2 et .tar.

Il n'y a plus ensuite qu'à lancer l'installation proprement dite, toujours en ligne de commande, à l'aide des instructions suivantes :

# ./configure
# make
# sudo !! install

L'utilisation de !! dans la suite d'instruction précédente permet de récupérer dans l'historique des commandes la dernière commande exécutée dans son intégralité.

Cette substitution est d'ailleurs particulièrement utile lorsque l'on a voulu exécuter une instruction requérant les droits du super-utilisateur sans utiliser sudo, puisqu'un simple sudo !! permet d'exécuter une nouvelle fois la commande avec les bons droits sans avoir à la retaper dans son intégralité.

Les scripts nécessaires à l'utilisation de la complétion dans bash sont donc maintenant installés.

Cependant, Mac OS X ne respecte pas l'arborescence de fichiers requise par les scripts pour qu'ils fonctionnent correctement, et il est donc nécessaire d'ajouter quelques lignes de configuration dans le fichier ~/.bashrc pour pallier à ce problème, à l'aide des instructions suivantes :

# echo 'BASH_COMPLETION=/usr/local/etc/bash_completion' >> ~/.bashrc
# !!:s/TION/TION_DIR/:s/tion/tion.d
# !!:s/_DIR/_COMPAT_DIR

Encore une fois, l'historique est mis à contribution pour ne pas avoir à retaper la majorité du contenu des instructions à chaque fois.

La chaîne de caractères !! permet toujours de récupérer dans l'historique la dernière commande exécuter, tandis que :s est un modificateur qui permet d'effectuer un chercher/remplacer dans l'instruction récupérée.

Ainsi, dans notre cas, s/TION/TION_DIR TION et :s/tion/tion.d remplace respectivement TION par TION_DIR et tion par tion.d.

Et dans le cas de la dernière instruction, :s/_DIR/_COMPAT_DIR permet de remplacer _DIR, ajouté lors de la substitution effectuée sur la première instruction pour générer la seconde instruction, par _COMPAT_DIR.

Une fois tout cela effectué, il ne vous reste plus qu'à lancer un nouveau terminal pour profiter des nouvelles capacités de complétion de bash.