2009-01-09 16 views
27

mein Python-Programm kann mit einer Reihe von verschiedenen Optionen (oder Subbefehle) gestartet werden wie:Linie Abschluss mit benutzerdefinierten Befehlen

$ myProgram doSomething 
$ myProgram doSomethingElse 
$ myProgram nowDoSomethingDifferent 

Ich mag es mit Auto-Vervollständigung verwenden, so dass, wenn ich Typen „MyProgram d "Es gibt" myProgram doSomething "zurück und wenn ich" myProgram n "eintippe, wird" myProgram nowDoSomethingDifferent "gerendert. Dies ist ähnlich der durchschnittlichen Verwendung des Moduls rlcompleter, aber es wählt nicht mögliche Abschlussoptionen aus dem Dateisystem (oder aus dem Verlauf), sondern aus einem benutzerdefinierten Satz von Zeichenfolgen (die den verfügbaren Optionen für mein Programm entsprechen)

Irgendeine Idee, wie man das umsetzt?

Mir ist die Variable PYTHONSTARTUP bekannt (die auf eine Datei zeigen sollte, die ich nicht weiß, wie man schreibt).

Als Arbeitsbeispiel django-admin (aus dem django-Paket) genau die gleiche Funktion hat ich suche

+0

das ist eine Bash-Frage. Sie müssten bash anpassen, damit es funktioniert. Es hat nichts mit Python zu tun. – nosklo

Antwort

37

Erstellen Sie eine Datei "mypro-completion.bash" und geben Sie sie in Ihrer .bashrc-Datei ein. So etwas wie dies Sie, um loszulegen ...

_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

Kann dies mit Aliasen verwendet werden? Ich habe [gist] (https://gist.github.com/vko-online/8fc32fb6bcf0369b3ab0) und möchte Autocomplete auf einigen Websites wie Twitter Google etc, irgendwelche Ideen? –

+0

Ich habe seltsamen Fehler, 'Befehl nicht gefunden: abgeschlossen' = ( –

3

Neben ich weiß, ist PYTHON für Befehle ausgeführt werden, wenn der Interpreter gestartet werden [1]. rlcompleter ist für Autovervollständigung innerhalb Ihr Skript, wenn es readline Bibliothek verwendet. Etwas wie folgt aus:

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

In Ihrem Beispiel wollen Sie auf dem Shell Befehlszeile zu vervollständigen. Diese Autokomplettierung ist eine Shell-Funktion (entweder bash oder zsh, was auch immer Sie verwenden). Siehe beispielsweise an introduction to bash autocompletion (auch part 2). Für zsh siehe zum Beispiel this guide.

6

Wenn ich richtig verstanden habe, möchten Sie Zeile Abschluss in der Befehlszeile, bevor Ihr Python-Skript startet. Dann sollten Sie nicht nach einer Python-Lösung suchen, sondern sich die Shell-Funktionen ansehen.

Wenn Sie bash verwenden, können Sie/etc/bash_completion betrachten, und mindestens auf debian/ubuntu sollten Sie eine Datei in /etc/bash_completion.d/ erstellen, die die Vervollständigungen für Ihr Programm angibt.

+0

+1. Ich würde für diesen gehen. Wenn Sie eine Endbearbeitung abgeschlossen haben, ist es sehr einfach, sie einzurichten. Und es gibt dem Benutzer eine gewohnte Benutzeroberfläche. – PEZ

0

Wenn Sie möchten, dass Ihr Programm eine Befehlszeilenoption auswählt, obwohl Sie nur eine abgekürzte Form dieser Option verwendet haben, sollten Sie sich die optparse module in der Standardbibliothek ansehen.

15

Es ist das Modul optcomplete, die Sie den Abschluss für bash Auto-Vervollständigung in Ihrem Python-Programm zu schreiben. Dies ist sehr nützlich in Kombination mit optparse. Sie nur Ihre Argumente einmal definieren, fügen Sie folgendes zu Ihrem Bashrc

complete -F _optcomplete <program> 

und alle Optionen werden automatisch vervollständigt werden.

+2

optparse ist nicht veraltet und ersetzt durch argparse. Bevorzugen argcomplete: https://github.com/kislyuk/argcomplete – user48956

8

Wie in anderen Antworten erwähnt, kann dies in Bash mit der Bash-Einbau complete getan werden. Einfacher als das Schreiben einer Funktion (wie in richq's answer) verwendet complete die Option -W, mit der Sie eine Liste von Wörtern angeben können.In Ihrem Beispiel wäre dies:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram 

Da es ein Einzeiler ist, dass Sie keine Datei für diese erstellen müssen, aber man kann es nur in Ihrem .bashrc setzen.

Verwandte Themen