- Présentation d’une méthode pour implémenter une fonctionnalité d’autocomplétion par tabulation avec affichage de descriptions, y compris pour des mots déjà complétés, dans Bash et Zsh
- Bash et Zsh utilisent des API d’autocomplétion différentes, et seul Zsh fournit nativement l’affichage des descriptions dans l’autocomplétion
- La structure consiste à générer les candidats avec
_generate_foo_completions, puis à les renvoyer via COMPREPLY dans Bash et compadd dans Zsh
- Pour reproduire dans Bash la fonctionnalité de description de Zsh, on inclut la description dans la chaîne candidate, puis on la supprime uniquement lorsqu’il n’y a qu’un seul candidat
- Même en présence d’un seul candidat, on améliore le comportement en ajoutant volontairement une ambiguïté afin d’afficher la description lors de l’appui sur
<TAB>
- Le script final offre la même expérience utilisateur dans les deux shells et prend en charge la complétion partielle, la complétion totale et l’affichage des descriptions des candidats
Contexte du problème
- L’autocomplétion par tabulation (tab-completion) est utile pour explorer des commandes ou des flags, en particulier lorsqu’on découvre une API ou un outil CLI
- Par défaut, Zsh n’affiche les descriptions que lorsqu’il y a plusieurs candidats, et Bash ne le permet qu’au prix d’une configuration supplémentaire
- Mais pour un mot déjà entièrement complété, aucun des deux shells n’affiche de description
- L’utilisateur doit donc passer par une procédure fastidieuse pour voir la description :
- supprimer quelques caractères pour faire correspondre plusieurs candidats
- appuyer sur la touche
<TAB> pour afficher la liste des candidats
- repérer visuellement la description voulue
- retaper les caractères supprimés pour exécuter la commande
Aperçu de la solution
- Même lorsqu’il n’y a qu’un seul candidat, on ajoute un candidat factice (dummy completion) pour créer une ambiguïté
- Cela permet à Bash comme à Zsh d’afficher la liste des candidats avec leurs descriptions
- Il faut toutefois veiller à ce que le texte de description ne soit pas inséré dans la commande réelle
Concepts de base
- Lorsqu’on appuie sur
<TAB>, l’autocomplétion reçoit le mot courant et la position du curseur, puis renvoie une liste de candidats possibles
- Bash : affectation des candidats dans le tableau
COMPREPLY
- Zsh : enregistrement des candidats via la commande
compadd
- La fonction
_generate_foo_completions affiche les chaînes candidates et peut, en pratique, les générer dynamiquement selon l’état du CLI
Prise en charge simultanée de Bash et Zsh
- Implémentation adaptée à chaque shell avec les fonctions
_complete_foo_bash et _complete_foo_zsh
- Distinction via
if [ -n "${ZSH_VERSION:-}" ]; then ... elif [ -n "${BASH_VERSION:-}" ]; then ... fi
- L’utilisateur enregistre ensuite le script dans
.bashrc ou .zshrc avant de l’appliquer
Affichage des descriptions dans Zsh
- Les chaînes candidates utilisent le format
nom: description
- Zsh : transmission parallèle du nom et de la description via
compadd -d raw -- $trimmed
- Bash : seuls les candidats sans la partie description sont transmis à
COMPREPLY (pas de prise en charge native des descriptions)
Implémenter les descriptions dans Bash
- En cas de candidats multiples, on affiche directement les chaînes contenant les descriptions
- En cas de candidat unique, on supprime seulement la description
- On exploite le comportement de Bash, qui n’insère que le préfixe commun lors de l’autocomplétion, afin d’éviter que la description ne soit ajoutée à la saisie réelle
Afficher une description même avec un seul candidat
- Pour montrer la description même lorsqu’un mot est déjà complété et que l’utilisateur appuie sur
<TAB>, on ajoute un candidat factice pour provoquer une ambiguïté
- Zsh : ajout du candidat factice dans les deux tableaux parallèles (
raw, trimmed)
- Bash : lorsqu’il n’y a qu’un seul candidat, ajout du nom seul dans
trimmed
Résultat final
Aucun commentaire pour le moment.