Изменить способ обработки автозаполнения модулем Python Cmd

У меня есть консоль 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()
10
задан Erik Youngren 23 October 2010 в 05:28
поделиться