当有输出时,将仍然缓冲的标准输入行向下移动一位

Move still-buffered stdin line down by one when there is output

我在python写了一个简单的聊天程序。 你只有一个简单的 input() 提示符(使用 readline),它应该总是在底部。

partner: hey
you > (stdin)

现在,我在不使用 curses 的情况下进行尝试,并且通过定义这两个常量取得了成功

CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2M'

每当收到来自 'partner' 的消息时,我都会这样使用它:

print(ERASE_LINE + CURSOR_UP_ONE)
print('partner > ' + msg)
print('you > ')

这很好用,但是,有一个问题:当我开始输入时,就在收到来自 'partner' 的消息时,它会删除包括我输入的内容在内的行(然后我就无法再输入了) access) 和擦除的字符显然仍然是 input() returns.

的一部分

那么,有没有一种方法可以在没有 curses 的情况下向下移动输入提示,或者有一种方法可以缓冲输入的字符以便能够访问、显示和操作它们?

如果您将终端置于原始模式(使用模块 termios),并在键入时处理每个击键,那么您将知道是否有打印合作伙伴消息之前的任何缓冲输入。

(另外,如何从合作伙伴(套接字?)接收消息,以及如何多路复用来自 TTY 和合作伙伴的输入?)

好的,我解决了我的问题。 我发现了模块 rl。我是这样使用的:

import rl.readline as readline

# code

print(ERASE_LINE + CURSOR_UP_ONE)
print('partner > ' + msg)

readline.redisplay(True)

这只是重新显示提示,包括我输入的内容(正是我想要的)。