[英]How to make python autocompletion display matches?
我有一个具有自动完成功能的完成者类。 简单版本:
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个单词用于自动完成[“ help ”,“ mkdir ”,“ mktbl ”]。
如果用户执行:
> he<tab>
用户得到:
> help
但如果用户执行
> mk<tab>
没有任何事情发生,因为没有一个匹配(mkdir和mktbl)
如果有多个匹配项,如何显示选项? 像Bash一样使用文件名自动完成?
因此,用户可以获得如下内容:
> mk<tab>
mktbl mkdir
> mk<cursor>
PS我试过试试
_readline.insert_text(...)_
和
打印...
进入完成函数,但它刹车插入,所以用户得到这样的东西:
> mk<tab>
> mkmktbl mkdir <cursor>
PPS我需要一个linux解决方案。
设置readline选项
set show-all-if-ambiguous on
如果你想在第一个<tab>
之后完成。 否则只需按两次<tab>
。
参考: http : //caliban.org/bash/,Section readline提示和技巧
PS。 在OS X和Linux上测试了你的代码,它运行良好(在我的机器上;)
我被建议一个完整答案的解决方案。 它允许组织自动完成选项的完成输出。
对于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,堆栈溢出有一个答案:
如何让IPython按类组织标签完成的可能性?
不知道它对mac的作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.