我试图停用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
的情况下,制表键覆盖符号。