Python cmd模块多级选项卡已完成(来自两个或多个列表)



我当前版本的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, 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

我想我找到了解决自己问题的方法:

def complete_set(self, text, line, start_index, end_index):
if len(line.split()) == 2:  # Only complete the parameter if setting is already provided
return [
command + ' ' for command in parameters
if command.startswith(text)
]
else:
return [
command + ' ' for command in settings
if command.startswith(text)
]

最新更新