通过注册回调函数,我以“选择”方式使用 GNU Readline:
rl_callback_handler_install("", on_readline_input);
然后连接rl_callback_read_char
为我的select()
循环的回调STDIN_FILENO
。这都是非常标准的东西,并且工作正常。
现在,我的程序将消息异步打印到屏幕上,有时会与用户的输入交错。“干净”的会话如下所示:
user input
SERVER OUTPUT
SERVER OUTPUT
user input
SERVER OUTPUT
但是,如果当服务器响应到达时用户正在排队呢?然后它变得丑陋:
user input
SERVER OUTPUT
user inSERVER OUTPUT
put
SERVER OUTPUT
如果用户输入了任何内容(这很容易通过检查来判断),我只需在服务器输出之前打印一个换行符即可解决此问题rl_line_buffer
,然后rl_forced_update_display()
在打印服务器输出后执行此操作。现在看起来像这样:
user input
SERVER OUTPUT
user in
SERVER OUTPUT
user input
SERVER OUTPUT
这更好,但仍然不完美。当用户键入整行但尚未按 Enter 键时,问题就出现了——然后它看起来像这样:
user input
SERVER OUTPUT
user input
SERVER OUTPUT
user input
SERVER OUTPUT
这很糟糕,因为在用户看来他们键入了三个命令(三个输入的三个响应与两个输入的三个响应一样可能,这就是实际发生的情况)。
一个讨厌的黑客(有效)是这样做的:
user input
SERVER OUTPUT
user input - INCOMPLETE
SERVER OUTPUT
user input
SERVER OUTPUT
我想我可以通过打印退格 ('\b') 字符而不是 来改进这一点" - INCOMPLETE"
,但这在我的终端上似乎根本没有做任何事情(Ubuntu Hardy 上的 gnome-terminal)。 printf("ABC\b");
只是打印ABC
,无论出于何种原因。
那么如何擦除不完整的输入行呢?要么通过某种方式打印退格(我可以弄清楚要打印多少 - 它是strlen(rl_line_buffer)
),还是通过使用一些我还不知道的 Readline 工具?