【问题标题】:Add suggestions to python session autocomplete that appear in IPython notebook too也向出现在 IPython 笔记本中的 python 会话自动完成添加建议
【发布时间】:2015-02-13 15:56:17
【问题描述】:

我正在尝试向交互式 python 选项卡自动完成添加定制建议。我在互联网上找到了这个玩具示例

import readline, rlcompleter

addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com']

class mycompleter(rlcompleter.Completer):
    def completer(self, text, state):
        options = [x for x in addrs if x.startswith(text)]
        try:
            return options[state]
        except IndexError:
            return None

readline.set_completer(mycompleter().completer)
readline.parse_and_bind("tab: complete")

如果我将它保存在一个模块中并导入它,这在 python 中非常有效。如果我使用 %paste 魔术将其粘贴到活动会话中,它也适用于 IPython。

但是,我无法通过加载模块或在单元格中运行它来使其在 IPython Notebook 中工作。我找到了关于他们对 readline 模块的扩展的 ipython 文档,但这并没有帮助。我尝试过从IPCompleter 对象继承,并使用rlcompete 方法等,但这似乎没有帮助。

关于如何以在普通 python 和 IPython Notebook 中工作的方式将内容添加到自动完成建议的任何建议

谢谢 尼尔

更新: 最终,我正在寻找一种向模块添加功能的方法,以便它可以动态更新会话自动完成列表(理想情况下用于特定函数集的 args,这样它就不会污染建议)。

【问题讨论】:

    标签: python autocomplete ipython ipython-notebook readline


    【解决方案1】:

    有一种方法可以做到这一点,这不是推荐的,但有效。

    def my_matches(test):
        # might want to be smarter here
        return ['angela@domain.com', 'michael@domain.com', 'david@test.com']
    ip = get_ipython()
    ip.Completer.matchers.append(my_matches)
    # it works
    

    老方法需要设置钩子,但我没用过,很老了 并且可以重构

    【讨论】:

    • 我喜欢被核心开发者推荐一种不推荐的做事方式的讽刺:D
    • 我真的在寻找一种向模块添加功能的方法,以便它可以动态更新会话自动完成列表(理想情况下用于特定函数集的 args,这样它就不会污染建议)。问题已更新以反映这一点 - 抱歉,如果我稍微移动了球门柱
    • 哼,没有用户动作的动态会很难。
    • 在进入时发表评论的愚蠢SO。您正在寻找的是一个 IPython 扩展,并且充满了魔力。您应该在 IPython-dev ML 或 github 上提出问题,因此不适合进行更长时间的讨论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多