Ho una console Cmd impostata per il completamento automatico dei nomi delle carte per un sistema di gestione delle raccolte Magic: the Gathering.Modifica del modo in cui Python Cmd Module gestisce il completamento automatico
Utilizza il parametro di testo per interrogare il database per le carte e utilizza i risultati per completare/suggerire automaticamente le carte.
Tuttavia, questi nomi carte hanno più parole, e Cmd corre completamento automatico dal ultima spazio alla fine della riga.
Ad esempio:
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)
ho provato afferrando manualmente quello che volevo dal parametro line
, che ottiene i risultati che voglio dal database, ma questo non riesce a sovrascrivere la prima parola:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Mage Slayer (Alara Reborn)
alla fine, ho bisogno di auto-completer a lavorare in questo modo:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Slayer (Alara Reborn)
Oltre al tentativo di parsing manuale qui sopra, ho anche provato a sostituire gli spazi con i segni più, e ho scoperto che Cmd è perfettamente felice di suddividere anche quelli. Sostituire spazi con caratteri di sottolineatura funziona, ma c'è una scheda in Unhinged che si chiama _____
, quindi devo passare attraverso acrobazie per eliminare le stringhe dal momento che non posso solo line.replace("_", " ")
.
Ecco alcuni codice di prova eseguibile:
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()
Ecco alcune buone informazioni qui: http://stackoverflow.com/questions/187621/how-to-make-a-python-command-line-program-autocomplete-arbitrary-things-not-int –
puoi fornire codice di prova eseguibile? Sembra possibile correggere – nosklo
Sì, l'ho visto anch'io, @offsound, è dove ho avuto l'idea di usare Cmd. Prenderò un po 'di codice di test. –