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

时间:2011-02-01 23:19:56

标签: 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

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

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

completer = Completer()
readline.set_completer(completer.complete)
user_input =raw_input("> ")

因此,示例中有3个单词用于自动完成[“帮助”,“ mkdir ”,“ mktbl ”]

如果用户执行:
> he<tab>
用户得到:
> help

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

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

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


P.S。我试图把 _readline.insert_text(...)_

打印......
进入完成功能,但它刹车插入,所以用户得到这样的东西:
> mk<tab>
> mkmktbl mkdir <cursor>

P.P.S我需要一个Linux解决方案。

2 个答案:

答案 0 :(得分:6)

设置readline选项

set show-all-if-ambiguous on

如果您想要在第一个<tab>之后完成。否则只需点击<tab>两次。

参考:http://caliban.org/bash/ readline提示与技巧

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

答案 1 :(得分:2)

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

对于linux readline有功能 readline.set_completion_display_matches_hook
http://docs.python.org/library/readline.html?highlight=readline#readline.set_completion_display_matches_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<tab>

useless text to be displayed
mk
mkdir mktbl
5  

> mk<cursor>

对于Windows readline,堆栈溢出有一个答案:
How do I make IPython organize tab completion possibilities by class?

不知道它是如何运作的。