Domanda

il mio programma Python può essere lanciato con una gamma di diverse opzioni (o sottocomandi) come:

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

Voglio che usi il completamento automatico in modo che se scrivo " myProgram d " restituisce " myProgram doSomething " e se scrivo " myProgram n " rende " myProgram nowDoSomethingDifferent " ;. Questo è simile all'uso medio del modulo rlcompleter , ma non seleziona le possibili opzioni di completamento dal filesystem (o dalla cronologia) ma da un set personalizzato di stringhe (che corrispondono alle opzioni disponibili per il mio programma)

Qualche idea su come implementarlo?

Sono a conoscenza della variabile PYTHONSTARTUP (che dovrebbe puntare a un file che non so scrivere).

Come esempio funzionante, django-admin (dal pacchetto django) ha la stessa funzione esatta che sto cercando

È stato utile?

Soluzione

Crea un file " myprog-completamento.bash " e sorgente nel tuo file .bashrc. Qualcosa del genere per iniziare ...

_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

Altri suggerimenti

Esiste il modulo optcomplete che ti permette di scrivere il completamento per bash completamento automatico nel tuo programma Python. Questo è molto utile in combinazione con optparse. Definisci i tuoi argomenti solo una volta, aggiungi quanto segue al tuo .bashrc

complete -F _optcomplete <program>

e tutte le opzioni verranno completate automaticamente.

Come menzionato in altre risposte, in bash questo può essere fatto con il completo incorporato in bash. Più facile che scrivere una funzione (come in risposta di richq ) sta usando l'opzione complete > -W che ti consente di specificare un elenco di parole. Nel tuo esempio questo sarebbe:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

Dato che è un one-liner non devi creare un file per questo, ma puoi semplicemente inserirlo nel tuo .bashrc .

Se capisco correttamente, vuoi il completamento della linea sulla riga di comando prima che inizi lo script Python. Quindi non dovresti cercare una soluzione Python, ma guarda le funzionalità della shell.

Se stai usando bash puoi guardare / etc / bash_completion, e almeno su debian / ubuntu dovresti creare un file in /etc/bash_completion.d/ che specifica i completamenti per il tuo programma.

Per quanto ne so, PYTHONSTARTUP serve per l'esecuzione dei comandi all'avvio dell'interprete [1] . rlcompleter è per il completamento automatico all'interno dello script, se utilizza la libreria readline . Qualcosa del genere:

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

Nel tuo esempio vuoi completare sulla riga di comando shell . Questo completamento automatico è una funzione di shell ( bash o zsh , qualunque cosa tu usi). Vedi, ad esempio, un'introduzione al completamento automatico di bash (anche parte 2 ). Per zsh , ad esempio questo guida .

Se vuoi che il tuo programma selezioni un'opzione della riga di comando anche se hai usato solo una forma abbreviata di questa opzione, dovresti dare un'occhiata a modulo optparse nella libreria standard.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top