【发布时间】:2011-06-19 15:22:05
【问题描述】:
我有一个带有自动完成功能的完成类。简单版:
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>
P.S.我已经尝试过
_readline.insert_text(...)_
和
打印 ...
进入完成函数,但它会阻止插入,所以用户会得到这样的东西:> mk<tab>> mkmktbl mkdir <cursor>
P.P.S 我需要一个 linux 解决方案。
【问题讨论】:
-
这不是一个完整的答案,对于这么简单的事情可能有点矫枉过正,但是使用
curses是一种很好的(尽管很复杂)方法来做这种事情:docs.python.org/library/curses.html 有看看这里的教程:docs.python.org/howto/curses.html#curses-howto -
有可能!谢谢!但我们对 readline 提供的功能绝对满意。我们唯一需要的是在自动完成时显示这个选项。我们研究了诅咒,但对于像这样的一件小事来说,它真的太复杂了。
-
有趣的问题,我也有类似的想法。
-
抱歉这个愚蠢的问题,但你试过
<tab><tab>吗?如果我只是按两次 Tab,您的代码会显示 Linux 和 OS X 上所有可能的完成(这对于 shell 来说也很常见)。 -
这很棘手。我在 windows 和 arch linux 机器上试过,
<tab><tab>没有用。当我看到这个评论时,我也在 fedora 14 vm 上尝试过——它成功了!我在下面列出了 Windows 机器的解决方案。 set_completion_display_matches_hook 是我的 arch linux 的解决方案。
标签: python autocomplete readline