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
这已经比之前好很多,但还不完美。问题出现在用户输入了整行文字但还没有按回车键时,界面看起来是这样的:
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工具,但我还不了解。