【问题标题】:Deactivate readline autocompletion停用 readline 自动完成功能
【发布时间】:2016-01-07 09:21:33
【问题描述】:

我尝试在使用 readline 自动完成后停用它。因此我想写一个这样的装饰器:

#!python
from contextlib import contextmanager
import readline

def main():
    with readline_autocompletion():
        raw_input('first: ')
    raw_input('second: ')

@contextmanager
def readline_autocompletion():
    readline.parse_and_bind('tab: complete')
    readline.set_completer_delims(' \t\n')
    readline.set_completer(None)

    yield

    # How to unload autocompletion without this hack??
    readline.set_completer(no_complete)

def no_complete(text,state):
    return None

if __name__ == '__main__':
    main()

如何为第二个 raw_input() 再次停用 readline 自动完成功能?

编辑

我现在设法通过设置仅返回 None 的完成程序来停用完成(参见上面的代码)。这是真的再次停用自动完成功能的方法吗?感觉像个黑客。

【问题讨论】:

    标签: python linux python-2.7 cygwin readline


    【解决方案1】:

    在调用readline.parse_and_bind('tab: complete') 之后,TAB 被映射到执行完成的函数上。如果未设置自定义完成程序,则使用默认系统文件完成。除了定义自定义存根函数来更改完成行为之外,还有更好的解决方案。

    TAB键可以像之前'tab: complete'绑定一样插入self(TAB符号):

    readline.parse_and_bind('tab: self-insert')
    

    请注意,python readline 模块基于 GNU Readline 库 (in case of OS X it may be libedit)。因此,该库的文档可以解释函数parse_and_bind。这里最有趣的部分是"Readline Init File"。函数parse_and_bind 将其输入字符串作为Readline Init File 传递。

    可以设置各种变量的值或将不同的功能绑定到键。

    例如,disable-completion 变量应该作为 'tab: self-insert' 工作:

    如果设置为On,Readline 将禁止单词完成。完成 字符将被插入到行中,就像它们已被映射一样 自我插入。默认为off

    然而,这并不完全正确。在当前库源代码(readline-6.3)中可以看到。如果变量disable-completion 设置为oncomplete 函数(绑定到tab)总是插入按键符号。但是,self-insert 仅在 insert 模式下插入符号。在overwrite 模式下,它会覆盖光标位置的符号。例如,绑定到Ctrl-a 键的功能切换覆盖模式,set disable-completion on 并保持complete 绑定到tab

    readline.parse_and_bind('tab: complete')
    readline.parse_and_bind('set disable-completion on')
    readline.parse_and_bind('C-a: overwrite-mode')
    

    起初,tab 键的作用与'tab: self-insert' 一样。但是,在按下Ctrl-a 后,会启用覆盖模式。现在 tab 键仍然插入 tab 符号,但在self-insert 的情况下,tab 键会覆盖符号。

    【讨论】:

    • 我可以在星期一测试这个,谢谢你的回答!你知道在哪里可以找到一些如何处理 readline 模块的资源吗? python 文档不是很广泛..
    • @Salo 我添加了示例和参考。可以看到,最靠谱的文档是库源码。
    • 非常感谢您的努力。我现在开始了解这个 readline 模块是如何工作的 ;)
    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2012-10-07
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多