У меня есть консоль Cmd, настроенная на автоматическое заполнение имен карт для Magic: система управления коллекцией Gathering.
Он использует параметр text для запроса базы данных о картах и использует результаты для автоматического заполнения / предложения карт.
Однако имена этих карт состоят из нескольких слов, и Cmd запускает автозаполнение с пробела last до конца строки.
Например:
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)
Я попытался вручную получить то, что я хотел, из параметра line
, который получает нужные мне результаты из базы данных, но это не может перезаписать первое слово:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Mage Slayer (Alara Reborn)
В конце мне нужно, чтобы автозаполнитель работал так:
mtgdb> add Mage Sl<tab>
mtgdb> add Mage Slayer (Alara Reborn)
Помимо попытки ручного синтаксического анализа, описанной выше, я также попытался заменить пробелы знаками плюса и обнаружил, что Cmd совершенно рад разделить их. Замена пробелов подчеркиванием работает, но в Unhinged есть одна карта с именем _____
, поэтому я должен пройти акробатику, чтобы освободить строки, так как я не могу просто line.replace("_", " ")
.
Вот некоторый работающий тестовый код:
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()