Моя текущая версия (очищенная для этого примера) интерфейса командной строки работает довольно хорошо с двумя уровнями завершения вкладки. У меня заканчиваются идеи о том, как добавить конкуренцию из второго списка вещей на выбор.
Здесь моя текущая версия:
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