gpt4 book ai didi

c - GNU 阅读线 : how to clear the input line?

转载 作者:太空狗 更新时间:2023-10-29 15:00:01 27 4
gpt4 key购买 nike

我以“选择”方式使用 GNU Readline,通过注册一个回调函数,如下所示:

rl_callback_handler_install("", on_readline_input);

然后将 rl_callback_read_char 挂接到 STDIN_FILENOselect() 循环的回调。这些都是非常标准的东西,而且工作正常。

现在,我的程序将消息异步打印到屏幕上,有时会与用户的输入交织在一起。一个“干净”的 session 看起来像这样:

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

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

一个讨厌的 hack(有效)是这样做的:

user input
SERVER OUTPUT
user input - INCOMPLETE
SERVER OUTPUT
user input
SERVER OUTPUT

我认为我可以通过打印退格 ('\b') 字符而不是 "- INCOMPLETE" 来改进这一点,但这似乎在我的终端上根本没有做任何事情(gnome- Ubuntu Hardy 上的终端)。 printf("ABC\b"); 只是打印 ABC,无论出于何种原因。

那么如何删除不完整的输入行呢?要么通过某种方式打印退格键(我可以算出要打印多少——它是 strlen(rl_line_buffer)),要么使用一些我还不知道的 Readline 工具?

最佳答案

经过大量的黑客攻击后,我获得了这种机制。我希望其他人会觉得它有用。它甚至不使用 select(),但我希望您能明白这一点。

#include <readline/readline.h>
#include <readline/history.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

const char const* prompt = "PROMPT> ";

void printlog(int c) {
char* saved_line;
int saved_point;
saved_point = rl_point;
saved_line = rl_copy_text(0, rl_end);
rl_set_prompt("");
rl_replace_line("", 0);
rl_redisplay();
printf("Message: %d\n", c);
rl_set_prompt(prompt);
rl_replace_line(saved_line, 0);
rl_point = saved_point;
rl_redisplay();
free(saved_line);
}


void handle_line(char* ch) {
printf("%s\n", ch);
add_history(ch);
}

int main() {
int c = 1;

printf("Start.\n");
rl_callback_handler_install(prompt, handle_line);

while (1) {
if (((++c) % 5) == 0) {
printlog(c);
}

usleep(10);
rl_callback_read_char();
}
rl_callback_handler_remove();
}

关于c - GNU 阅读线 : how to clear the input line?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1512028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com