C 如何抑制readline以打印某些内容,然后将其还原?

C 如何抑制readline以打印某些内容,然后将其还原?,c,readline,ansi-escape,C,Readline,Ansi Escape,我正在尝试编写一个只使用readline和ANSI转义码的控制台聊天客户端 我的目标是让终端处理聊天历史的回滚和滚动,同时始终在新输入消息后提供readline提示 我已经用我的两个线程尝试了以下内容。我的控制台输入线程执行以下操作: printf("\x1B[s"); // Save cursor position message = readline("Prompt > "); message = receive_message(); // Blocks for next messa

我正在尝试编写一个只使用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
我的消息接收线程执行以下操作:

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输入不换行,上述方法就可以工作。当它包装保存的光标位置的恢复不按预期工作时,它似乎只恢复水平位置,而不是垂直位置

即使输入行已换行,我如何调整上述代码以使其工作?

我受到了如何手动确定是否已换行的启发

现在,当我需要在readline提示符前打印某些内容时,我会执行以下操作:

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

message = readline("Prompt > ");
message = readline("Prompt > ");
结果证明包含了一个更好的解决方案。我复制了与回答此问题相关的引用解决方案中的代码:

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 > ");
message = readline("Prompt > ");
我不知道在发布我的问题之前我是如何看不到的。

有关所需行为的更好描述,请参阅。然而,当用户输入覆盖多行时,这个问题并没有涵盖或解决我的具体问题。