我正在尝试将自定义建议添加到交互式python选项卡自动完成。我在interweb上找到了这个玩具示例
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 magic将其粘贴到活动会话中,它也适用于IPython。
但是,我无法通过加载模块或在单元格中运行它来使其在IPython Notebook中工作。我找到了关于他们对{{1}}模块的扩展的ipython文档,但这没有帮助。我尝试继承readline
个对象,并使用IPCompleter
方法等,但这似乎没有帮助。
有关如何以普通python和IPython Notebook中的方式向自动填充建议添加内容的任何建议
由于 尼尔
更新 最后,我正在寻找一种向模块添加功能的方法,以便它可以动态更新会话自动完成列表(理想情况下是针对特定功能集的args,以便它不会污染建议)。
答案 0 :(得分:0)
有一种方法可以做到这一点,这不是推荐的,但有效。
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
旧的方式需要设置挂钩,但我还没有使用它并且已经很老了 并且可以重构