停用 readline 自动完成

Deactivate readline autocompletion

我试图在使用后停用 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 自动完成功能?

编辑

我现在设法通过设置一个仅执行 return None 的完成器来停用完成(参见上面的代码)。这是真的为了再次停用自动完成的方式吗?感觉像黑客。

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

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

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

有关详细信息,请考虑 python readline 模块基于 GNU Readline 库(in case of OS X it may be libedit). So, the documentation for the library can explain the function parse_and_bind. Here the most interesting part is "Readline Init File"。函数 parse_and_bind 将其输入字符串作为 Readline Init 文件传递​​。

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

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

If set to On, Readline will inhibit word completion. Completion characters will be inserted into the line as if they had been mapped to self-insert. The default is 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 之后,覆盖模式被启用。现在 Tab 键仍然插入制表符,但在 self-insert 的情况下,Tab 键会覆盖符号。