Question

Mon programme Python peut être lancé avec différentes options (ou sous-commandes) telles que:

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

Je veux qu'il utilise l'auto-complétion pour que, si je tape "monProgramme d" il retourne & my; Program doSomething " et si je tape "myProgram n" il rend "Mon programme maintenant fait quelque chose de différent". Ceci est similaire à l'utilisation moyenne du module rlcompleter , mais il ne sélectionne pas les options de complétion possibles dans le système de fichiers (ou dans l'historique), mais dans un ensemble personnalisé de chaînes (correspondant aux options disponibles pour mon programme)

Avez-vous une idée sur la façon de mettre en œuvre cela?

Je connais la variable PYTHONSTARTUP (qui devrait indiquer un fichier que je ne sais pas écrire).

Par exemple, django-admin (du paquet django) a exactement la même fonctionnalité que je recherche

Était-ce utile?

La solution

Créer un fichier " myprog-completion.bash " et le source dans votre fichier .bashrc. Quelque chose comme ça pour vous aider à commencer ...

_myProgram()
{
  cur=${COMP_WORDS[COMP_CWORD]}
  case "${cur}" in
    d*) use="doSomething" ;;
    n*) use="nowDoSomethingElse" ;;
  esac
  COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o default -o nospace -F _myProgram  myProgram

Autres conseils

Le module optcomplete vous permet d'écrire l'achèvement de bash. autocompletion dans votre programme python. Ceci est très utile en combinaison avec optparse. Vous définissez vos arguments une seule fois, ajoutez ce qui suit à votre .bashrc

complete -F _optcomplete <program>

et toutes vos options seront complétées automatiquement.

Comme mentionné dans d'autres réponses, cela peut être fait avec bash avec complete dans bash. Plus facile que d'écrire une fonction (comme dans la réponse de richq ), on utilise l'option complete -W qui vous permet de spécifier une liste de mots. Dans votre exemple, cela serait:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

Comme c'est un one-liner, vous n'avez pas besoin de créer de fichier pour cela, mais vous pouvez simplement le mettre dans votre .bashrc .

Si je comprends bien, vous souhaitez que la ligne soit terminée avant le début du script python. Ensuite, vous ne devriez pas rechercher une solution python, mais regarder les fonctionnalités du shell.

Si vous utilisez bash, vous pouvez consulter / etc / bash_completion, et au moins sur debian / ubuntu, vous devez créer un fichier dans /etc/bash_completion.d/ qui spécifie les achèvements de votre programme.

Aussi bien que je sache, PYTHONSTARTUP est destiné aux commandes à exécuter au démarrage de l'interpréteur [1] . rlcompleter est destiné à l'auto-complétion à l'intérieur de votre script, s'il utilise la bibliothèque readline . Quelque chose comme ça:

$ ./myscript.py
My Script version 3.1415.
Enter your commands:
myscript> B<TAB>egin
myscript> E<TAB>nd

Dans votre exemple, vous souhaitez compléter la ligne de commande shell . Cette auto-complétion est une fonctionnalité du shell ( bash ou zsh , quoi que vous utilisiez). Voir, par exemple, la une introduction à l'auto-complétion de bash (également partie 2 ). Pour zsh , voir, par exemple, this guide .

Si vous souhaitez que votre programme sélectionne une option de ligne de commande alors que vous n’avez utilisé qu’une forme abrégée de cette option, consultez le module optparse dans la bibliothèque standard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top