我的当前版本的CLI(在此示例中已清除)在两个级别的制表符完成时均能很好地工作。我没有关于如何从第二种可供选择的事物中增加竞争的想法了。
这是我当前的版本:
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,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