rl.set_completer()
删除完成函数,但不删除 TAB 绑定。所以标签被吃掉了,但是当标签被传递给“无函数”时,什么也没做。
readline.parse_and_bind("TAB: '\t'")
导致对底层完成函数的无限调用。
Read TAB -> Return TAB -> Read TAB …
最简单的方法,至少在这里测试的时候,是使用默认的emacs模式。如果仅导入readline
而不设置任何内容,则read_raw
适用于箭头键,并且 TAB 会导致 TAB。
如果这不是一个选项,请设置自定义完成函数。(适用于 Python 3)。这也很可能是更安全的选择。
如果按 TAB 键,则会调用完成函数。对于一个TAB 键,state
参数开始于0
并在每次调用函数时递增。当我们返回TAB
时,检查 state 是很重要的0
。否则它将被一次又一次地调用。
我们还必须返回文本(如果有),否则它会被readline
.
简单的例子:
#!/usr/bin/env python2.7
import readline
def rl_tab_expander():
def completer(txt, state):
if state == 0:
return txt + '\t'
return completer
readline.set_completer(rl_tab_expander())
readline.parse_and_bind('set editing-mode vi')
while 1:
inp = raw_input("$ ")
if inp.strip() in ('exit', 'q', 'quit'):
break
检查原始测试
您可以使用日志文件。在这里,我们看看如果我们返回 TAB 或者如果我们不state
按照上面的示例进行检查,完成函数中会发生什么。我们将限制设置为state
25,否则它将继续无限。
在一个控制台窗口中运行脚本并在另一个控制台窗口中执行tail -f /tmp/test-readline.log
。
#!/usr/bin/env python2.7
import readline
import logging
logging.basicConfig(filename = '/tmp/test-readline.log', level = logging.DEBUG)
def rl_tab_expander():
def completer(txt, state):
logging.debug("STATE: %2d TXT: %s", state, repr(txt))
if state > 24:
return None
return txt + '\t'
return completer
readline.set_completer(rl_tab_expander())
readline.parse_and_bind('set editing-mode vi')
while 1:
inp = raw_input("$ ")
if inp.strip() in ('exit', 'q', 'quit'):
break
结果
DEBUG:root:STATE: 0 TXT: ''
DEBUG:root:STATE: 1 TXT: ''
DEBUG:root:STATE: 2 TXT: ''
...
DEBUG:root:STATE: 24 TXT: ''
DEBUG:root:STATE: 25 TXT: ''
在不限制state
级别的情况下,这将一直持续到程序被杀死或者如果我们按下 Ctrl+C 并幸运的话。