如何使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