Ich habe eine Cmd-Konsole eingerichtet, um Kartennamen für ein Magic: the Gathering-Sammlungsverwaltungssystem automatisch zu vervollständigen.Ändern, wie Python-Cmd-Modul Autovervollständigung behandelt
Es verwendet den Textparameter, um die Datenbank nach Karten abzufragen, und verwendet die Ergebnisse zur automatischen Vervollständigung/Andeutung von Karten.
Diese Kartennamen haben jedoch mehrere Wörter, und Cmd führt Autovervollständigung vom letzten Speicherplatz bis zum Ende der Zeile aus.
Zum Beispiel:
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)
Ich habe versucht, von Hand greifen, was ich aus dem line
Parameter wollte, die die Ergebnisse, die ich aus der Datenbank wollen wird, aber dies nicht das erste Wort zu überschreiben:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Mage Slayer (Alara Reborn)
Am Ende muss ich die auto-Vervollständiger wie dies funktioniert:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Slayer (Alara Reborn)
Abgesehen von dem oben beschriebenen manuellen Parsing-Versuch, habe ich auch versucht, Leerzeichen durch Pluszeichen zu ersetzen, und festgestellt, dass Cmd perfekt daran ist, auch diese zu teilen. Ersetzen von Leerzeichen durch Unterstriche funktioniert, aber es gibt eine Karte in Unhinged, die _____
heißt, also muss ich durch Akrobatik gehen, um die Strings zu verlieren, da ich nicht einfach line.replace("_", " ")
.
Hier ist ein lauffähiges Testcode:
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()
Es gibt einige gute Informationen hier: http://stackoverflow.com/questions/187621/how-to-make-a-python-command-line-program-autocomplete-arbitrary-things-not-int –
können Sie zur Verfügung stellen lauffähiger Testcode? Das scheint zu beheben – nosklo
Ja, ich sah auch, @offsound, es ist, wo ich die Idee hatte, Cmd zu verwenden. Ich werde einen Testcode erstellen. –