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

标签 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个自动补全词["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 解决方案。

最佳答案

设置readline选项

set show-all-if-ambiguous on

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

引用:http://caliban.org/bash/ , readline 提示和技巧部分

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

关于python - 如何使python自动完成显示匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869121/

相关文章:

c# - 一种压缩多个阅读线的方法?

Python.readline()

python - 我想将文本放入 pyqt QCalendarWidget

python - 如何强制 os.system() 使用 bash 而不是 shell

python - 获取除一个字段以外的所有字段

javascript - React-tag-autocomplete 处理重复标签

python - 测试给定的输入值是否不从 while True 循环中断

Python 自动完成用户输入

java - 如何使自动完成预测可点击?

Java BufferedReader readLine() 在 read() 之后突然不工作