【问题标题】:How to make python autocompletion display matches?如何使python自动完成显示匹配?
【发布时间】: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


【解决方案1】:

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

对于 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?

不知道它在 mac 上是如何工作的。

【讨论】:

    【解决方案2】:

    设置 readline 选项

    set show-all-if-ambiguous on
    

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

    参考:http://caliban.org/bash/readline 提示和技巧部分

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

    【讨论】:

    • 谢谢!您的回答解决了 linux 上的问题。它不适用于 Windows。但是windows有readline和cmd的反常版本,所以不幸的是没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多