我尝试在使用它后停用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()
的完成符来停用完成(请参阅上面的代码)。 真的 是否可以再次停用自动完成功能?感觉就像一个黑客。
答案 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键会覆盖符号。