Tengo una consola Cmd configurada para completar automáticamente los nombres de las tarjetas para un sistema de administración de la colección Magic: the Gathering.Cambiar cómo Python Cmd Module maneja la autocompletación
Utiliza el parámetro de texto para consultar la base de datos de tarjetas, y utiliza los resultados para autocompletar/sugerir tarjetas.
Sin embargo, estos nombres de tarjetas tienen varias palabras, y Cmd ejecuta la autocompletacion desde el último espacio hasta el final de la línea.
Por ejemplo:
mtgdb> add Mage<tab><tab>
Mage Slayer (Alara Reborn) Magefire Wings (Alara Reborn)
mtgdb> add Mage S<tab><tab>
Sages of the Anima (Alara Reborn)
Sanctum Plowbeast (Alara Reborn)
Sangrite Backlash (Alara Reborn)
Sanity Gnawers (Alara Reborn)
Sen Triplets (Alara Reborn)
[...]
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Slave of Bolas (Alara Reborn)
Intenté agarrar manualmente lo que quería de parámetro line
, que consiga los resultados que quiero de la base de datos, pero esto no puede sobrescribir la primera palabra:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Mage Slayer (Alara Reborn)
al final, necesito el auto más completa para trabajar de esta manera:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Slayer (Alara Reborn)
Además del intento de análisis manual anterior, también traté de reemplazar espacios con signos más y descubrí que Cmd está muy feliz dividiéndolos también. Reemplazar espacios con guiones bajos funciona, pero hay una carta en Unhinged que se llama _____
, así que tengo que pasar por acrobacias para demunge las cadenas ya que no puedo simplemente line.replace("_", " ")
.
Aquí hay un código ejecutable de prueba:
import cmd
commands = [
"foo",
"foo bar blah",
"bar",
"bar baz blah",
"baz",
"baz foo blah"]
class Console(cmd.Cmd):
intro = "Test console for" + \
"http://stackoverflow.com/questions/4001708/\n" + \
"Type \"cmd<space><tab><tab>\" to test " + \
"auto-completion with spaces in commands\nwith " + \
"similar beginings."
def do_cmd(self, line):
print(line)
def complete_cmd(self, text, line, start_index, end_index):
if text:
return [command for command in commands
if command.startswith(text)]
else:
return commands
if __name__ == "__main__":
command = Console()
command.cmdloop()
Hay alguna buena información aquí: http://stackoverflow.com/questions/187621/how-to-make-a-python-command-line-program-autocomplete-arbitrary-things-not-int –
puede proporcionar código de prueba ejecutable? Eso parece posible reparar – nosklo
Sí, también vi eso, @offsound, de ahí surgió la idea de usar Cmd. Prepararé un código de prueba. –