У меня есть консоль Cmd, настроенная для автоматического заполнения имен карт для системы управления коллекцией Magic: the Gathering.
Это использует текстовый параметр для запроса карточек в базе данных и использует результаты для автозаполнения / предложения карточек.
Однако в названиях карточек есть несколько слов, и Cmd запускает автозаполнение с последнего пробел до конца строки.
Например:
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()