En bash, il est assez facile de configurer l'achèvement personnalisé des arguments de commande à l'aide de la fonction complete
intégrée. Par exemple, si, pour une commande hypothétique avec un synopsis de foo --a | --b | --c
, vous pourriez fairecomplete -W '--a --b --c' foo
Vous pouvez également personnaliser l'achèvement que vous obtenez lorsque vous appuyez Tabà un vide rapide en utilisant complete -E
, par exemple, complete -E -W 'foo bar'
. Ensuite, en appuyant sur tab à l'invite vide suggérerait uniquement foo
et bar
.
Comment personnaliser l'achèvement de la commande à une invite non vide? Par exemple, si je suis assis à:
anthony@Zia:~$ f
comment personnaliser l'achèvement de sorte que la pression sur l'onglet se termine toujours foo
?
(Le cas réel que j'aimerais est loc
TAB→ localc
. Et mon frère, qui m'a poussé à le demander, le veut avec mplayer).
la source
loc
àlocalc
? Je suggère des alternatives car après un certain temps à creuser et à chercher, je n'ai pas trouvé un moyen de personnaliser l'achèvement de bash de cette façon. Ce n'est peut-être pas possible.locate
,locale
,lockfile
ou l' une des autres extensions deloc
. Une meilleure approche serait peut-être de mapper une clé différente pour cette réalisation spécifique.loc<TAB>->localc
)?Réponses:
L'achèvement de la commande (avec d'autres choses) est géré via l' achèvement de la ligne de lecture bash . Cela fonctionne à un niveau légèrement inférieur à la «complétion programmable» habituelle (qui n'est invoquée que lorsque la commande est identifiée et les deux cas spéciaux que vous avez identifiés ci-dessus).
Mise à jour: la nouvelle version de bash-5.0 (janvier 2019) ajoute
complete -I
exactement ce problème.Les commandes readline pertinentes sont:
De manière similaire à la plus courante
complete -F
, une partie de cela peut être transférée à une fonction en utilisantbind -x
.Cela permet à votre propre chaîne de commande ou préfixe de se connecter
~/.complete.d/
. Par exemple, si vous créez un exécutable~/.complete.d/loc
avec:Cela fera (à peu près) ce que vous attendez.
La fonction ci-dessus va à certaines longueurs pour émuler le comportement normal d'achèvement de la commande bash, bien qu'il soit imparfait (en particulier le bagage à
sort | fmt | column
main douteux pour afficher une liste de correspondances).Cependant , un problème non trivial avec cela, il ne peut utiliser qu'une fonction pour remplacer la liaison à la
complete
fonction principale (invoquée avec TAB par défaut).Cette approche fonctionnerait bien avec une liaison de touches différente utilisée uniquement pour la complétion de commande personnalisée, mais elle n'implémente tout simplement pas la logique de complétion complète après cela (par exemple, des mots ultérieurs dans la ligne de commande). Pour ce faire, il faudrait analyser la ligne de commande, gérer la position du curseur et d'autres choses délicates qui ne devraient probablement pas être prises en compte dans un script shell ...
la source
Je ne sais pas si je n'ai pas compris votre besoin de cela ...
Cela impliquerait que votre bash ne connaît qu'une seule commande commençant par
f
.Une idée de base de l'achèvement est: si elle est ambiguë, imprimez les possibilités.
Vous pouvez donc définir votre
PATH
dans un répertoire contenant uniquement cette commande et désactiver toutes les commandes bash pour obtenir ce travail.Quoi qu'il en soit, je peux également vous donner une sorte de solution:
Donc, si vous tapez,
_ <Tab>
il se terminera à_ foo
qui s'exécutefoo
.Mais ce
alias f='foo'
serait néanmoins beaucoup plus facile.la source
La réponse simple pour vous serait de
juste les sorties de base
il suffit d'ajouter le programme souhaité pour terminer automatiquement jusqu'à la fin
la source
Exécutez la commande ci-dessous pour trouver où le binaire mplayer est installé:
OU utilisez le chemin vers le binaire mplayer si vous le savez déjà, dans la commande ci-dessous:
Idéalement, tout ce que vous tapez est recherché dans tous les répertoires spécifiés dans la
$PATH
variable.la source
mplayer
est déjà dans leur$PATH
et ils veulent quelque chose commemp<tab>
produiremplayer
, au lieu de tous les binaires qui commencentmp
(par exemple,mpage
mpcd
mpartition
mplayer
etc.)