停用readline自动补全功能



我试图停用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(' tn')
    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的补全器来停用补全(参见上面的代码)。这个真的是的方式去为了再次停用自动完成?

调用readline.parse_and_bind('tab: complete')后,TAB映射到执行补全的函数上。如果未设置自定义补全,则使用默认的系统文件补全。有比定义自定义存根函数更好的解决方案来改变补全行为。

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

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

详细信息请考虑python readline模块基于GNU readline库(在OS X的情况下可能是libedit)。因此,库的文档可以解释parse_and_bind函数。这里最有趣的部分是"Readline Init File"。函数parse_and_bind将其输入字符串作为Readline Init File传递。

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

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

如果设置为On, Readline将禁止单词补全。完成字符将被插入到行中,就好像它们已经被映射了一样self-insert。默认为off

然而,这并不完全正确。可以在当前的库源代码(readline-6.3)中看到它。如果变量disable-completion设置为on,则complete函数(绑定到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后,覆盖模式将被启用。现在制表键仍然插入制表符,但在self-insert的情况下,制表键覆盖符号。

最新更新