当用户点击退格一次时,python readline lib删除整行

时间:2012-08-05 05:37:10

标签: python readline

如果使用sys.stdout.writeprint而不是raw_input撰写提示,则会发生这种情况。以下脚本演示了它:

$ cat overwrite.py
import readline, sys

if 'libedit' in readline.__doc__:
    readline.parse_and_bind('bind ^I rl_complete')
else:
    readline.parse_and_bind('tab: complete')
def set_completer(choices):
    choices = sorted(map(str,choices))
    def completer(txt, state):
        if state == 0:
            completer.options = [c for c in choices if c.startswith(txt)]
        if state < len(completer.options):
            return completer.options[state]
        return None
    readline.set_completer(completer)

set_completer(['foo','flup'])
sys.stdout.write('input: ')
x = raw_input()
print x

如果您运行python overwrite.py,则会收到预期的提示:“input:”。如果你按一次退格键,没有任何内容被删除(readline认为它已经在行的开头,我猜)。然而,如果你点击'f'然后退格,那么整个行,包括提示都会被删除。

我必须经历并替换我写入stdout 的所有地方非常不方便我希望通过调用raw_input从用户那里获得输入,所以我希望没有必要使用raw_input。关于readline,python文档非常稀疏。

1 个答案:

答案 0 :(得分:2)

没有其他真正的方法来解决这个问题;虽然readline具有rl_already_prompted变量,但它仍然需要传递提示,以便readline的函数可以正确地管理输入行。