programar - Cómo hacer un python, programa de línea de comandos autocompletar cosas arbitrarias NO intérprete
python download (6)
Aquí hay una versión completa del código que fue muy útil por ephemient here (gracias).
import readline
addrs = [''[email protected]'', ''[email protected]'', ''[email protected]'']
def completer(text, state):
options = [x for x in addrs if x.startswith(text)]
try:
return options[state]
except IndexError:
return None
readline.set_completer(completer)
readline.parse_and_bind("tab: complete")
while 1:
a = raw_input("> ")
print "You entered", a
Soy consciente de cómo configurar el autocompletado de objetos de Python en el intérprete de Python (en Unix).
- Google muestra muchos resultados para obtener explicaciones sobre cómo hacer esto.
- Desafortunadamente, hay tantas referencias que es difícil encontrar lo que tengo que hacer, lo cual es ligeramente diferente.
Necesito saber cómo habilitar, tabulación / finalización automática de elementos arbitrarios en un programa de línea de comandos escrito en python.
Mi caso de uso específico es un programa de línea de comando python que necesita enviar correos electrónicos. Quiero poder autocompletar las direcciones de correo electrónico (tengo las direcciones en el disco) cuando el usuario escribe una parte (y opcionalmente presiona la tecla TAB).
No lo necesito para trabajar en Windows o Mac, solo en Linux.
Dado que dices "NO intérprete" en tu pregunta, supongo que no quieres respuestas que impliquen la lectura de Python y cosas por el estilo. ( Editar : en retrospectiva, obviamente ese no es el caso. Ho hum. Creo que esta información es interesante de todos modos, así que la dejo aquí).
Creo que puedes estar después de this .
Se trata de agregar la finalización del nivel de shell a comandos arbitrarios, extendiendo la finalización de pestañas de bash.
En pocas palabras, creará un archivo que contenga una función de shell que generará posibles terminaciones, guárdelo en /etc/bash_completion.d/
y regístrelo con el comando complete
. Aquí hay un fragmento de la página vinculada:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
En este caso, el tipo de foo --[TAB]
le dará los valores en la variable opts
, es decir, --help
, --verbose
y --version
. Para sus propósitos, esencialmente querrá personalizar los valores que se ponen en opts
.
Mire el ejemplo en la página vinculada, todo es bastante sencillo.
Me sorprende que nadie haya mencionado argcomplete, aquí hay un ejemplo de los documentos:
from argcomplete.completers import ChoicesCompleter
parser.add_argument("--protocol", choices=(''http'', ''https'', ''ssh'', ''rsync'', ''wss''))
parser.add_argument("--proto").completer=ChoicesCompleter((''http'', ''https'', ''ssh'', ''rsync'', ''wss''))
Sigue la documentación del cmd y estarás bien
import cmd
addresses = [
''[email protected]'',
''[email protected]'',
''[email protected]'',
]
class MyCmd(cmd.Cmd):
def do_send(self, line):
pass
def complete_send(self, text, line, start_index, end_index):
if text:
return [
address for address in addresses
if address.startswith(text)
]
else:
return addresses
if __name__ == ''__main__'':
my_cmd = MyCmd()
my_cmd.cmdloop()
Salida para pestaña -> pestaña -> enviar -> pestaña -> pestaña -> f -> pestaña
(Cmd)
help send
(Cmd) send
[email protected] [email protected] [email protected]
(Cmd) send [email protected]
(Cmd)
Usa los enlaces readline
de Python. Por ejemplo,
import readline
def completer(text, state):
options = [i for i in commands if i.startswith(text)]
if state < len(options):
return options[state]
else:
return None
readline.parse_and_bind("tab: complete")
readline.set_completer(completer)
Los documentos del módulo oficial no son mucho más detallados, consulte los documentos de lectura para obtener más información.
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind(''tab:complete'')
# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc