40 votes

Complément d'onglet personnalisé pour bash

J'ai mon utilitaire de console personnalisé cooltool avec une liste d'options

fooOption
barOption

Que dois-je faire pour que bash puisse autocompléter les options en appuyant sur la touche tab clé ?

Je veux dire que l'utilisateur a tapé

$ ./cooltool foo_

puis a appuyé sur tab . Et puis

$ ./cooltool fooOption _

est apparu.

51voto

dogbane Points 4201

La méthode la plus simple consiste à ajouter les éléments suivants à votre fichier .bashrc.

_cooltool()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "fooOption barOption" -- $cur) )
}
complete -F _cooltool cooltool

Chaque fois que vous tapez cooltool f[TAB][TAB] le _cooltool() est invoquée. Elle déterminera quel est votre mot partiel actuel et ensuite compgen déterminera quelles options correspondent. Celles-ci sont stockées dans un tableau appelé COMPREPLY qui s'affiche alors. Regardez man complete y man compgen pour les détails.

Pour un bon tutoriel, allez voir : Écrire votre propre fonction de complétion Bash

8voto

AlexTheBird Points 171

Vous pourriez vouloir regarder de plus près dans le répertoire /etc/bash_completion.d de votre système.

Vous devriez également lire cette introduction . Le site deuxième partie de l'introduction est celui dont vous avez besoin.

4voto

James Mertz Points 390

Ecrire un script de complétion bash pour cooltool . Le site complétion bash est livré avec des scripts pour de nombreux programmes populaires, que vous pouvez utiliser comme exemples.

3voto

3voto

dcc310 Points 121

En plus de la réponse de dogbane, vous pourriez également faire :

complete -W "fooOption barOption" cooltool

si vous voulez simplement faire correspondre une liste de mots à partir du début de la chaîne. Il semble que complete et compgen partagent la plupart des options. Je n'ai remarqué que la correspondance du "début de la chaîne" dans les commandes que j'utilise, donc j'ai trouvé intéressant que vous puissiez faire d'autres choses dans la fonction _cooltool comme :

COMPREPLY=( $(grep "$cur" ~/my_potential_args.txt) )

pour correspondre à n'importe quel endroit du nom de l'option.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X