相关疑难解决方法(0)

GNU Readline:如何清除输入行?

我通过注册回调函数,以"选择"的方式使用GNU Readline:

rl_callback_handler_install("", on_readline_input);
Run Code Online (Sandbox Code Playgroud)

然后挂钩rl_callback_read_char作为我的select()循环的回调STDIN_FILENO.这都是非常标准的东西,并且工作正常.

现在,我的程序异步地将消息打印到屏幕上,有时与用户的输入交错."干净"的会话看起来像这样:

user input
SERVER OUTPUT
SERVER OUTPUT
user input
SERVER OUTPUT
Run Code Online (Sandbox Code Playgroud)

但是,如果用户在服务器响应到达时位于线路中间,该怎么办?然后它变得丑陋:

user input
SERVER OUTPUT
user inSERVER OUTPUT
put
SERVER OUTPUT
Run Code Online (Sandbox Code Playgroud)

如果用户输入任何内容(通过检查很容易判断rl_line_buffer),然后rl_forced_update_display()在打印服务器输出后执 现在它看起来像这样:

user input
SERVER OUTPUT
user in
SERVER OUTPUT
user input
SERVER OUTPUT
Run Code Online (Sandbox Code Playgroud)

这更好,但仍然不完美.当用户键入整行但尚未按Enter键时出现问题 - 那么它看起来像这样:

user input
SERVER OUTPUT
user input
SERVER OUTPUT
user input
SERVER OUTPUT
Run Code Online (Sandbox Code Playgroud)

这很糟糕,因为用户看起来他们输入了三个命令(三个输入的三个响应与两个输入的三个响应一样可能,这实际上是发生的).

讨厌的黑客(有效)是这样做的:

user input
SERVER OUTPUT
user input - INCOMPLETE
SERVER OUTPUT
user input …
Run Code Online (Sandbox Code Playgroud)

c readline

5
推荐指数
2
解决办法
4487
查看次数

标签 统计

c ×1

readline ×1