我需要一些帮助。我完全难过了。我正在尝试为自定义shell样式程序编写自己的选项卡完成模块(也完成参数)我可以选项卡完成命令,但参数给我带来了麻烦。有人可以写一个示例选项卡完成模块供我查看吗? 可用命令: ['show','exit','clear','ship'] 对于命令show,first arg: [ 'IP', 'MAC', '选择'] 对于sub arg IP: [ '外部,' 内部”, '本地']
最后我希望能够去:
My Prompt > sh<tab>
show ship
My Prompt > sho<tab>
My Prompt > show <tab>
ip mac options
My Prompt > show ip <tab>
external local internal
My Prompt > show ip e<tab>
My Prompt > show ip external
等等等等。如果我只有一个很好的工作示例,我想我可以解决这个问题。我完全重写了我的标签完成代码5次,但我仍然无法得到它。有人可以帮忙吗?
答案 0 :(得分:1)
最后我在第7次重写后想出来了。比我想要的更麻烦,但可行,我可能会稍后清理它。无论如何,这是代码:
"""defined earlier in the script:"""
COMMANDS=['show', 'exit', 'ship']
def complete(text, state, list = COMMANDS):
for option in list:
if option.startswith(text):
if not state:
return option
else:
state -= 1
def precomplete(text, state):
BUFFER=readline.get_line_buffer()
args=[None,None,None,None,None,None,None,None,None,None]
argtemp=[]
if BUFFER != "":
i=-1
while i != BUFFER.count(" "):
if BUFFER.count(" ") >= 0:
if BUFFER.count(" ") == 0: #1 because len() starts couting at 1
return complete(text, state)
else:
print "Else triggered"
o=0
verb=[]
while complete(BUFFER.split()[0],o):
verb.append(complete(BUFFER.split()[0],o))
o=o+1
if len(verb) == 1:
verb=verb[0]
print verb
if BUFFER.count(" ") >= 1:
if BUFFER.count(" ") == 1:
if verb == 'show':
return complete(text, state, ['mac', 'ip', 'arp'])
else:
o=0
while complete(BUFFER[1],o,['mac', 'ip', 'arp']):
argtemp.append(complete(BUFFER[1],o,['mac', 'ip', 'arp']))
o=o+1
if len(argtemp) == 1:
argtemp==argtemp[0]
i=i+1
else:
return complete(text,state)
readline.parse_and_bind("tab: complete")
readline.set_completer(precomplete)
编辑:完整代码:http://codepad.org/W3VHURUx
答案 1 :(得分:0)
答案 2 :(得分:0)
您可能对以一般方式执行此操作的现有实施感兴趣。
CLI toolkit执行命令和一些参数完成。但是,从Python中做得很好,结果证明并非完全可能。这主要是由于readline库(在编译的代码中运行)在那时控制了用户输入,因此在调用输入方法之前必须事先知道所有的完成。