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 histverify
, bash 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.
11 réactions
1 De tienslebien - 01/09/2011, 15:26
Cela fait un moment que je n'ai pas utilisé MacOSX au profit d'une bonne Debian, mais de mémoire, zsh est installé par défaut, tu devrais essayer avec un peu de configuration, (tu trouveras facilement des zshrc sur le web), ça fait pas mal de chose sympa surtout pour la completion.
2 De mageekguy - 01/09/2011, 15:57
@tienslebien : J'attendais cette remarque ;).
Je confirme pour zsh, que je connais également et qui est bien plus puissant que bash au niveau de la complétion (et à d'autre également), mais j'ai des habitudes bien ancrées sous bash et je n'ai pas la motivation suffisante pour les changer tant que la valeur ajoutée ne m'apparaîtra pas suffisamment pertinente.
3 De Séb - 02/09/2011, 09:50
Et content de OSX ? Je vois de plus en plus de développeurs qui switch vers MAC et qui utilisent TextMate.
4 De mageekguy - 02/09/2011, 11:31
@Séb : Pour l'utilisation que j'en ai, j'en suis extrêmement content.
D'ailleurs, je n'ai pas allumé mon portable sous FreeBSD depuis que j'ai le MBA.
5 De Matthieu - 03/09/2011, 14:12
Mac OS X est un excellent environnement de travail !
Par contre, je ne comprends pas trop l'intérêt de cet article : qu'as-tu gagné après cette installation ?? Le seul rajout que j'y ai fait (excepté une bonne quantité d'alias), c'est la recherche dans l'historique par défaut (.bashrc) :
# History search
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
# Case insensitive
bind "set completion-ignore-case on"
Ça change la vie !
6 De mageekguy - 04/09/2011, 10:09
@Matthieu : bash-complétion permet d'avoir une complétion cohérente en fonction de la commande en cours de saisie.
Si tu fais
tar <tab>
, par exemple, tu n'obtiendras que les fichiers .tar contenu dans le répertoire courant.De même, si tu fais
ssh <tab>
, tu obtiendras la liste de serveurs sur lesquels tu t'es déjà connecté.Bref, ça change la vie ;).
Et personnellement, je mettrais tes ajouts dans le fichier
.inputrc
, ce qui permet d'éviter les appels àbind
.7 De Matthieu - 04/09/2011, 18:21
@mageekguy : Excellent ! Effectivement j'imagine que ça peut changer la vie, j'installe ça de suite merci.
8 De Séb - 05/09/2011, 18:08
D'accord ! Je suis toujours partagé quand je vois un MAC entre : "Woua ! C'est beau ! Je veux aussi !" et "Apple, c'est evil !"
Je suis sous Gentoo pour l'instant et j'ai jamais connu autant de flexibilité avec un système. Par exemple pour PHP :
# /etc/portage/package.use
dev-lang/php -* filter fpm iconv postgres session
www-servers/nginx -* http nginx_modules_http_fastcgi nginx_modules_http_gzip pcre
# /etc/portage/package.unmask
<=dev-lang/php-5.5
# /etc/make.conf
PHP_INI_VERSION="development"
Et c'est OK, le gestionnaire de paquet compilera du PHP 5.4 minimal sur mesure.
9 De trashims - 11/11/2011, 08:07
Awesome ! Merci beaucoup pour l'astuce.
10 De Teenage - 13/06/2012, 22:00
Très bon article, je cherchais a installer l'autocomplétion pour Drush et je me retrouve avec plein d'astuce sur l'historique, bravo !
Par contre, sous mac osx (snow leopard) c'est le .profile qui remplace le .bashrc et si l'on suit le README de l'install il ne faut pas oublier l’exécution de l'autocompletion :
#à ajouter au .profile
# Use bash-completion, if available
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
11 De andykimpe - 16/05/2013, 17:47
c'est peut être plus rapide et plus simple d’utiliser homebrew non ?
brew install bash-completion