OK 周りを検索した後、これに対する解決策を見つけ、次のように printf() を置き換えました。rl_replace_line("", 0) を使用すると、現在の行がクリアされ、カーソルが行の先頭に置かれます。次に、メッセージの行を出力し、readline プロンプトを復元して、元の行を元の場所に置き換えます。カーソル位置を復元します。
ただし、このハックでは、この printf 関数の呼び出しの最後に \n を含める必要があります。そうしないと、行が readline によって上書きされます。
#define printf(...) my_rl_printf(__VA_ARGS__)
void my_rl_printf(char *fmt, ...)
{
int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0;
char *saved_line;
int saved_point;
if (need_hack)
{
saved_point = rl_point;
saved_line = rl_copy_text(0, rl_end);
rl_save_prompt();
rl_replace_line("", 0);
rl_redisplay();
}
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
if (need_hack)
{
rl_restore_prompt();
rl_replace_line(saved_line, 0);
rl_point = saved_point;
rl_redisplay();
free(saved_line);
}
}