2009-01-09 19 views
27

mi programa de Python se puede iniciar con una gama de diferentes opciones (o subcomandos) como:terminación de línea con comandos personalizados

$ myProgram doSomething 
$ myProgram doSomethingElse 
$ myProgram nowDoSomethingDifferent 

lo quiero usar el completado automático con modo que si i tipo "MYPROGRAM d "devuelve" myProgram doSomething "y si escribo" myProgram n ", se mostrará" myProgram nowDoSomethingDifferent ". Esto es similar a la utilización media del módulo rlcompleter, pero no recoge las posibles opciones de terminación del sistema de archivos (o de la historia), sino de un conjunto personalizado de cuerdas (que corresponden a las opciones disponibles para mi programa)

¿Alguna idea sobre cómo implementar esto?

Conozco la variable PYTHONSTARTUP (que debería apuntar a un archivo que no sé cómo escribir).

Como un ejemplo de trabajo, django-admin (del paquete django) tiene la misma función exacta que estoy buscando

+0

esa es una pregunta bash. Tendrás que personalizar Bash para que funcione. No tiene nada que ver con Python. – nosklo

Respuesta

37

Cree un archivo "myprog-completion.bash" y encuéntrelo en su archivo .bashrc. Algo como esto para que pueda empezar ...

_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

¿Se puede usar esto con alias? Tengo [gist] (https://gist.github.com/vko-online/8fc32fb6bcf0369b3ab0) y quiero autocompletar en algunos sitios web como twitter google etc., ¿alguna idea? –

+0

recibí un error extraño, 'command not found: complete' = ( –

3

tan bien como yo sé, PYTHONSTARTUP es para los comandos a ejecutar cuando el intérprete se pone en marcha [1]. rlcompleter es para autocompletar dentro de su secuencia de comandos, si está utilizando la biblioteca readline. Algo como esto:

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

En su ejemplo que desea completar en la línea de comandos shell . Esta función de autocompletado es una característica de shell (bash o zsh, lo que sea que use). Véase, por ejemplo, an introduction to bash autocompletion (también part 2). Para zsh, ver, por ejemplo, this guide.

6

Si entiendo correctamente, quiere que la línea se complete en la línea de comando antes de que comience su script python. Entonces no deberías buscar una solución de Python, pero mira las características de la shell.

Si está utilizando bash puede consultar/etc/bash_completion, y al menos en debian/ubuntu debe crear un archivo en /etc/bash_completion.d/ que especifique las terminaciones para su programa.

+0

+1. Yo iría por este. Si tiene un conjunto de finalizaciones de finalización, es muy sencillo configurarlo. Y le da al usuario una interfaz a la que están acostumbrados. – PEZ

0

Si desea que su programa para seleccionar una opción de línea de comandos a pesar de que sólo se utiliza una forma abreviada de esta opción usted debe echar un vistazo a la optparse module en la biblioteca estándar.

15

No es el módulo optcomplete, que le permite escribir la terminación para la terminación automática fiesta en su programa de pitón. Esto es muy útil en combinación con optparse. Sólo definir sus argumentos una vez, añada lo siguiente a su .bashrc

complete -F _optcomplete <program> 

y serán rellenado automáticamente todas sus opciones.

+2

optparse no está en desuso y reemplazado por argparse. Prefiero argcomplete: https://github.com/kislyuk/argcomplete – user48956

8

Como se menciona en otras respuestas, en bash esto se puede hacer con el bash-builtin complete. Más fácil que escribir una función (como en richq's answer) está usando la opción complete-W que le permite especificar una lista de palabras.En el ejemplo, esto sería:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram 

Como se trata de una sola línea que no tiene que crear un archivo para esto, pero sólo puede ponerlo en su .bashrc.

Cuestiones relacionadas