如何使python自动完成显示匹配?

如何使python自动完成显示匹配?,python,autocomplete,readline,Python,Autocomplete,Readline,我有一个带有自动补全函数的补全类。简单版本: class Completer: def __init__(self): self.words = ["mkdir","mktbl", "help"] self.prefix = None def complete(self, prefix, index): if prefix != self.prefix: self.matching_words = [w f

我有一个带有自动补全函数的补全类。简单版本:

class Completer:
    def __init__(self):
        self.words = ["mkdir","mktbl", "help"]
        self.prefix = None

    def complete(self, prefix, index):
        if prefix != self.prefix:
            self.matching_words = [w for w in self.words if w.startswith(prefix)]
            self.prefix = prefix
        else:
            pass                
        try:
            return self.matching_words[index]
        except IndexError:
            return None
并执行如下操作,以使用readline自动完成:

import readline
readline.parse_and_bind("tab: complete")

completer = Completer()
readline.set_completer(completer.complete)
user_input =raw_input("> ")
因此,本例中有3个词表示自动完成[“帮助”、“mkdir”、“mktbl”]

如果用户执行:
>他

用户获得:
>帮助

但是如果用户执行
>mk

因为没有一个匹配项(mkdir和mktbl),所以没有发生任何事情

如果存在多个匹配项,如何显示选项?像Bash一样,如何使用文件名自动完成功能?

因此,用户将得到如下结果:
>mk

mktbl mkdir

>mk


p.S.我试着把
_readline.插入文本(…)\ubr> 和
打印…
进入completer函数,但它阻止了插入,因此用户得到如下结果:
>mk

>mktbl mkdir


p.p.S我需要一个linux解决方案。

设置readline选项

set show-all-if-ambiguous on
如果您希望在第一次
之后完成。否则只需点击两次

参考:,第节阅读提示和技巧


另外,在OS X和Linux上测试了你的代码,它运行良好(在我的机器上;)

有人建议我一个解决方案来完成答案。它允许组织自动完成选项的完成输出

对于linux readline,有以下功能 readline.set\u completion\u display\u matches\u hook

因此,对于上面列出的示例,这段代码

def print_suggestions(self, substitution, matches, longest_match_length) :
    print "useless text to be displayed"
    print substitution
    print " ".join[match for match in matches]
    print longest_match_length

readline.set_completion_display_matches_hook(print_suggestions)
这将产生:
>mk

>mk

对于windows readline,堆栈溢出有一个答案:


不知道它对mac是如何工作的。

这不是一个完整的答案,对于这么简单的事情来说可能有些过分,但使用
诅咒
是一种很好的(尽管很复杂)方法:看看这里的教程:可能是!非常感谢。但我们对readline提供的功能绝对满意。我们唯一需要的就是在自动完成时显示这些选项。我们研究了诅咒,但它真的太复杂了,只有这样一件小事。有趣的问题,我也有类似的想法。很抱歉这个愚蠢的问题,但你试过
?您的代码显示了Linux和OS X上所有可能的完成情况,如果我只需点击tab两次(这对于shell来说也不少见)。这很棘手。我在windows和arch linux机器上试用了它,但是
不起作用。当我看到这条评论时,我也在Fedora14虚拟机上尝试过——它成功了!我在下面列出了windows计算机的解决方案。设置\完成\显示\匹配\钩子是我的arch linux的解决方案。谢谢!您的回答解决了linux上的问题。它在windows上不工作。但windows的readline和cmd版本不正确,所以很遗憾,它还可以。
useless text to be displayed
mk
mkdir mktbl
5