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

Maj*_*cRa 7 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 for w in self.words if w.startswith(prefix)]
            self.prefix = prefix
        else:
            pass                
        try:
            return self.matching_words[index]
        except IndexError:
            return None
Run Code Online (Sandbox Code Playgroud)

并执行类似这样的操作以使用readline进行自动完成:

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

completer = Completer()
readline.set_completer(completer.complete)
user_input =raw_input("> ")
Run Code Online (Sandbox Code Playgroud)

因此,在示例中有3个单词用于自动完成[" help "," mkdir "," mktbl "].

如果用户执行:
> he<tab>
用户获取:
> help

但如果用户执行
> mk<tab>
没有任何事情发生,因为没有一个匹配(mkdir和mktbl)

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

因此,用户可以获得如下内容:
> mk<tab>
mktbl mkdir
> mk<cursor>


PS我试图把
_readline.insert_text(...)_

print ...
放到完成函数中,但是它会使插入变制,所以用户得到这样的东西:
> mk<tab>
> mkmktbl mkdir <cursor>

PPS我需要一个linux解决方案.

mik*_*iku 6

设置readline选项

set show-all-if-ambiguous on
Run Code Online (Sandbox Code Playgroud)

如果你想在第一次之后完成<tab>.否则就打<tab>两次.

参考:http://caliban.org/bash/,第readline的技巧和窍门

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