2009-01-09 10 views
27

mon programme Python peut être lancé avec une gamme de différentes options (ou sous-commandes) comme:fin de ligne avec des commandes personnalisées

$ myProgram doSomething 
$ myProgram doSomethingElse 
$ myProgram nowDoSomethingDifferent 

je le veux utiliser l'auto-complétion avec de sorte que si i type « MyProgram d "il retourne" myProgram doSomething "et si je tape" myProgram n "il rend" myProgram nowDoSomethingDifferent ". Ceci est similaire à l'utilisation moyenne du module rlcompleter, mais il ne choisit pas les options d'achèvement possibles du système de fichiers (ou de l'historique) mais d'un ensemble personnalisé de chaînes (qui correspondent aux options disponibles pour mon programme)

Une idée sur la façon de mettre en œuvre cela?

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

Comme un exemple de travail, django-admin (à partir du package django) a la même fonction exacte que je cherche

+0

c'est une question bash. Vous devez personnaliser bash pour le faire fonctionner. Cela n'a rien à voir avec python. – nosklo

Répondre

37

Créez un fichier "myprog-completion.bash" et amenez-le dans votre fichier .bashrc. Quelque chose comme ça pour 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 
+0

Peut-il être utilisé avec des alias? J'ai [gist] (https://gist.github.com/vko-online/8fc32fb6bcf0369b3ab0) et je veux autocomplete sur certains sites comme twitter google etc, des idées? –

+0

J'ai eu une erreur étrange, 'commande non trouvée: complete' = ( –

3

Aussi bien que je sais, PYTHONSTARTUP est pour les commandes à exécuter lorsque l'interpréteur démarre [1]. rlcompleter est pour l'auto-complétion à l'intérieur votre script, s'il utilise la bibliothèque readline. Quelque chose comme ceci:

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

Dans votre exemple, vous souhaitez terminer sur la ligne de commande shell . Cette auto-complétion est une fonctionnalité shell (bash ou zsh, quelle que soit votre utilisation). Voir, par exemple, an introduction to bash autocompletion (également part 2). Pour zsh, voir par exemple this guide.

6

Si je comprends bien, vous voulez terminer la ligne sur la ligne de commande avant le démarrage de votre script python. Ensuite, vous ne devriez pas chercher une solution python, mais regardez les fonctionnalités du shell. Si vous utilisez bash, vous pouvez regarder/etc/bash_completion, et au moins sur debian/ubuntu vous devriez créer un fichier dans /etc/bash_completion.d/ qui spécifie les complétions pour votre programme.

+0

+1. J'irais pour celui-ci. Si vous avez un ensemble fini de finitions c'est super simple de le configurer. Et cela donne à l'utilisateur une interface à laquelle il est habitué. – PEZ

0

Si vous voulez que votre programme sélectionne une option de ligne de commande même si vous avez seulement utilisé une forme abrégée de cette option, vous devriez jeter un oeil à la optparse module dans la bibliothèque standard.

15

Il est le module optcomplete qui vous permet d'écrire la fin de saisie semi-automatique bash dans votre programme python. Ceci est très utile en combinaison avec optparse. Vous ne définissez vos arguments qu'une seule fois, ajoutez ce qui suit à votre fichier .bashrc

complete -F _optcomplete <program> 

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

+2

optparse n'est pas obsolète et remplacé par argparse Préférer argcomplete: https://github.com/kislyuk/argcomplete – user48956

8

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

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram 

Comme il est en une ligne que vous ne devez pas créer un fichier pour cela, mais vous pouvez simplement le mettre dans votre .bashrc.

Questions connexes