J'ai un tas de scripts d'achèvement de bash configurés (principalement à l'aide de bash-it et de certains paramétrages manuels).
J'ai aussi un tas de pseudonymes configurés pour les tâches courantes comme gco
pour git checkout
. À l'heure actuelle, je peux taper git checkout d
Tabet develop
est terminé pour moi, mais lorsque je tape, gco d
Tabcela ne se termine pas.
Je suppose que c'est parce que le script d'achèvement est en train de se terminer git
et qu'il ne voit pas gco
.
Existe-t-il un moyen de faire en sorte que tous mes scripts de complétion fonctionnent avec mes alias de manière générique / par programme? Ne pas pouvoir terminer lors de l'utilisation du type d'alias annule l'objectif du pseudonyme.
bash
tab-completion
Dstarh
la source
la source
bash --version
pour obtenir cela (ne pas utiliser-v
, sortie différente).ll --[TAB]
une liste d'options sera imprimée pourls
? Je suis assez sceptique à ce sujet, mais si vous êtes certain qu'une telle chose existait dans 11.10, je serais curieux de l'explorer et de déterminer ce qui a été supprimé.Réponses:
Le code suivant, adapté de cette réponse au débordement de pile et à ce fil de discussion des forums Ubuntu ajoutera des compléments à tous vos alias définis:
Pour les alias simples (commande seulement, sans arguments), il affectera la fonction d'achèvement d'origine à l'alias; pour les alias avec arguments, il crée une fonction wrapper qui insère les arguments supplémentaires dans la fonction d'achèvement d'origine.
Contrairement aux scripts qu'il a évolué à partir, la fonction respecte guillemets les deux pour la commande alias et ses arguments (mais les premiers doivent correspondre par la commande d'achèvement, et ne peut pas être imbriquées), et il devrait filtrer de manière fiable les alias des listes de commandes et les tubes (qui sont ignorés, car il est impossible de savoir quoi compléter sans recréer la logique d'analyse complète de la ligne de commande du shell).
Usage
Enregistrez le code en tant que fichier de script shell et indiquez -le dans la source , ou copiez la fonction en gros dans
.bashrc
(ou dans votre fichier de points pertinent ). L’important est d’appeler la fonction après que les définitions d’achèvement de bash et d’alias ont été définies (le code ci-dessus appelle la fonction juste après sa définition, dans un esprit «source et oublie», mais vous pouvez déplacer l’appel n'importe où en aval si te va mieux). Si vous ne voulez pas que la fonction soit dans votre environnement après sa fermeture, vous pouvez l'ajouterunset -f alias_completion
après l'avoir appelée.Remarques
Si vous utilisez la version
bash
4.1 ou une version ultérieure et que vous utilisez des achèvements chargés de manière dynamique, le script tente de charger les achèvement de toutes vos commandes avec alias afin de pouvoir créer les fonctions d'encapsulation pour vos alias.la source
~/.bashrc
. Stockez-le en tant que fichier de script shell et sourcez-le (. /path/to/alias_completion.sh
), ou copiez et collez le code en gros./usr/share/bash-completion/completions/
ils ne sont chargés que la première fois que l'utilisateur tape[TAB]
. Ainsi, même si la fonction est chargée à partir de~/.bashrc
celle-ci, elle ne générera pas de complétions pour les alias de commandes. Après avoir vérifié que vouscomplete -p
travaillezapt-get
et queapt-cache
j'ai copié-collé votre fonction dans le terminal, elle fonctionne correctement./tmp
de~/.bash_completion
et ajoutés manuellement à son début les pertinentessource /usr/share/bash-completion/completions/
entrées (séparémentapt-get
etapt-cache
-apt-{cache,get}
ne fonctionne pas).Oui, voici le projet complete-alias qui résout votre problème avec précision. Il fournit la complétion d'alias générique et programmatique sans utiliser
eval
.la source
Ceci est la manière manuelle, pour ceux qui cherchent cela.
Tout d'abord, recherchez la commande d'achèvement d'origine. Exemple:
Ajoutez-les maintenant à votre script de démarrage (par exemple ~ / .bashrc):
source: https://superuser.com/a/1004334
la source