停用readline自动完成功能

时间:2015-10-09 12:15:58

标签: python linux python-2.7 cygwin readline

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

content=content.encode('utf-8').replace(u'£','*')

如何为第二个#!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() 再次停用readline自动完成功能?

修改

我现在设法通过设置仅返回raw_input()的完成符来停用完成(请参阅上面的代码)。 真的 是否可以再次停用自动完成功能?感觉就像一个黑客。

1 个答案:

答案 0 :(得分:1)

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

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

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

有关详细信息,请考虑python readline模块基于GNU Readline Library(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设置为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键会覆盖符号。