Mam ustawioną konsolę Cmd do automatycznego uzupełniania nazw kart dla systemu zarządzania kolekcjami Magic: the Gathering.Zmień sposób, w jaki moduł Python Cmd obsługuje autouzupełnianie
Używa parametru tekstowego do zapytania bazy danych o karty i wykorzystuje wyniki do automatycznego uzupełniania/sugerowania kart.
Jednak te nazwy kart mają wiele słów, a Cmd wykonuje automatyczne uzupełnianie z przestrzeni ostatniej na końcu linii.
Na przykład:
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)
Próbowałem ręcznie chwytając co chciałem od parametru line
, który dostaje wyniki chcę z bazy danych, ale to się nie powiedzie, aby zastąpić pierwsze słowo:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Mage Slayer (Alara Reborn)
W końcu muszę automatycznego Completer pracować tak:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Slayer (Alara Reborn)
Oprócz powyższej próby ręcznego parsowania, próbowałem również zastąpić spacje znakami plusa i odkryłem, że Cmd jest również całkowicie zadowolony z podziału na te. Zastępuje spacje znakami podkreślenia, ale w Unhinged jest jedna karta o nazwie _____
, więc muszę przejść akrobacje, aby zdemontować ciągi, ponieważ nie mogę po prostu line.replace("_", " ")
.
Oto niektóre runnable kodu testu:
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()
Tu jest kilka dobrych informacji: http://stackoverflow.com/questions/187621/how-to-make-a-python-command-line-program-autocomplete-arbitrary-things-not- –
czy możesz podać działający kod testowy? Wydaje się, że można to naprawić. – nosklo
Tak, widziałem też to, @offsound, to tam wpadłem na pomysł użycia Cmd. Zanurzę jakiś kod testowy. –