【发布时间】:2010-12-03 11:29:11
【问题描述】:
我以“选择”方式使用 GNU Readline,方法是注册一个回调函数,如下所示:
rl_callback_handler_install("", on_readline_input);
然后连接rl_callback_read_char 作为STDIN_FILENO 的select() 循环的回调。这些都是非常标准的东西,而且效果很好。
现在,我的程序将消息异步打印到屏幕上,有时会与用户的输入交错。 “干净”的会话如下所示:
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 工具?
【问题讨论】: