【问题标题】:Python: Homemade Tab Completion HelpPython:自制选项卡完成帮助
【发布时间】:2011-08-19 18:23:35
【问题描述】:

我需要一些帮助。我完全被难住了。我正在尝试为自定义 shell 样式程序编写自己的制表符完成模块(也完成参数)我可以制表符完成命令,但参数给我带来了麻烦。有人可以编写一个示例标签完成模块供我查看吗?
可用命令: ['显示','退出','清除','船'] 对于命令显示,第一个参数: ['ip','mac','选项'] 对于子 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 次,但我仍然无法得到它。有人可以帮忙吗?

【问题讨论】:

  • 没有人会免费为您编写代码,但如果您发布遇到特定问题的代码,您可能会看到几种改进方法。
  • 给你:codepad.org/pnuHKkL8 别太苛刻,我周三刚接触 python,所以我还不熟悉语言的所有细微差别。

标签: python command-line-interface homebrew tab-completion


【解决方案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

【讨论】:

    【解决方案2】:

    看看readlinerlcompleter

    【讨论】:

    • 我正在使用 readline,它工作得很好,但 rlcompleter 似乎不允许自定义命令(除非我遗漏了什么)。
    • @Trcx:您要求提供一个示例选项卡完成模块。查看 rlcompleter 的源代码。
    • 来源在哪里?我刚拿起python,不知道从哪里开始。
    • @Tcrx:在页面顶部,here
    • 谢谢你,我一定会去看看,但现在又开始工作了。 :(
    【解决方案3】:

    您可能对以一般方式执行此操作的现有实现感兴趣。

    CLI toolkit 执行命令和一些参数完成。然而,用 Python 做好这件事并不是完全可能的。这主要是因为 readline 库(在编译后的代码中运行)当时可以控制用户输入,因此您必须在调用输入法之前事先知道所有完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-13
      • 2023-01-23
      • 1970-01-01
      • 2011-09-12
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      相关资源
      最近更新 更多