gpt4 book ai didi

c - 我怎样才能抑制 readline 打印一些东西然后恢复它?

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:44 25 4
gpt4 key购买 nike

我正在尝试仅使用 readline 和 ANSI 转义码编写控制台聊天客户端。

我的目标是让终端处理聊天记录的回滚和滚动,同时始终在新输入消息后提供readline提示。

我已经用我的两个线程尝试了以下操作。我的控制台输入线程执行以下操作:

printf("\x1B[s"); // Save cursor position
message = readline("Prompt > ");

我的消息接收线程会:

message = receive_message(); // Blocks for next message
printf("\x1B[u"); // Restore cursor to before the prompt
printf("\x1B[J"); // Erase readline prompt and input (down to bottom of screen)
printf("%s\n", message); // Print the message (where readline was)
printf("\x1B[s"); // Save new cursor position
rl_forced_update_display(); // Restore readline

只要 readline 输入不换行,上面的代码就可以工作。当它环绕时,保存的光标位置的恢复没有按预期工作,它似乎只恢复水平位置,而不是垂直位置。

即使输入行换行,我如何调整上面的代码以工作?

最佳答案

This question结果包括一个更好的解决方案。我已经在此处复制了与回答此问题相关的引用解决方案中的代码:

message = receive_message();

// Solution
int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0;

int saved_point = rl_point;
char *saved_line = rl_copy_text(0, rl_end);
rl_save_prompt();
rl_replace_line("", 0);
rl_redisplay();

printf(message);

rl_restore_prompt();
rl_replace_line(saved_line, 0);
rl_point = saved_point;
rl_redisplay();
free(saved_line);

为了完整起见,输入线程清除了光标保存并变得简单:

message = readline("Prompt > ");

我不知道在发布我的问题之前我怎么没看到。

关于c - 我怎样才能抑制 readline 打印一些东西然后恢复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15398742/

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