2015-10-09 61 views
1

我试图在使用完后取消激活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(' \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停用完成(见上面的代码)。这是真的要走的路,以便再次停用自动补全?感觉像一个黑客。

回答

1

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

TAB键可以将自己(TAB符号)作为'tab: complete'之前绑定:

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

详细考虑到了蟒蛇的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后,覆盖模式启用。现在标签键仍然插入标签符号,但是在self-insert的情况下,标签键将覆盖符号。

+0

我将能够在星期一进行测试,感谢您的答案!你知道在哪里可以找到一些资源如何处理readline模块?蟒蛇文档不是真的广泛.. – Salo

+1

@Salo我添加了示例和参考。您可以看到最可靠的文档是库源代码。 –

+0

感谢您的努力。我现在开始理解这个readline模块是如何工作的;) – Salo