Многоуровневая вкладка модуля Python cmd завершена (из двух или более списков) - PullRequest
1 голос
/ 06 ноября 2019

Моя текущая версия (очищенная для этого примера) интерфейса командной строки работает довольно хорошо с двумя уровнями завершения вкладки. У меня заканчиваются идеи о том, как добавить конкуренцию из второго списка вещей на выбор.

Здесь моя текущая версия:

from cmd import Cmd

settings = ['first','second','third']
parameters = ['alpha', 'bravo', 'charlie']

class Prompt(Cmd):

    def __init__(self):
        Cmd.__init__(self)
        self.prompt = 'Command: '
        self.setting1 = ""
        self.setting2 = ""
        self.setting3 = ""

    def completenames(self, text, *ignored):
        # Modified tab complete to add extra space after command
        dotext = 'do_'+text
        return [a[3:]+' ' for a in self.get_names() if a.startswith(dotext)]

    def do_set(self, args):
        params = args.split()
        if len(params) == 0:
            print('Setting 1 = ' + self.setting1)
            print('Setting 2 = ' + self.setting2)
            print('Setting 3 = ' + self.setting3)
        else:
            if params[0] in settings and len(params) > 1:
                if params[0] == settings[0]:
                    self.setting1 = params[1]
                    print('Setting 1 = ' + self.setting1)
                elif params[0] == settings[1]:
                    self.setting2 = params[1]
                    print('Setting 2 = ' + self.setting2)
                elif params[0] == settings[2]:
                    self.setting3 = params[1]
                    print('Setting 3 = ' + self.setting3)
            else:
                print('Usage:')
                print('set <setting> <value>')
                print('type "set" for possible settings and their current value')

    def complete_set(self, text, line, start_index, end_index):
        if text:
            return [
                command + ' ' for command in settings
                if command.startswith(text)
            ]
        else:
            return settings

    def do_EOF(self, inp):
        print('\n')
        return True

Prompt().cmdloop()

С двумя уровнями это работает просто отлично:

Command: <tab>s<tab> fi<tab>

результат: set first

Я хочу, чтобы третья опция была завершена из этого списка параметров. Так бы это выглядело так:

Command: <tab>s<tab> fi<tab> br<tab>

результат, естественно, будет: set first bravo

...