将 GNU readline 提示设置为 NULL 会导致自定义提示被覆盖
Setting GNU readline prompt to NULL causes custom prompt to be overwritten
我正在用c写一个自定义的shell,遇到了一个奇怪的小bug,可以在下面的测试用例中看到:
#include <stdio.h>
#include <stdbool.h>
#include <readline/readline.h>
#include <readline/history.h>
int main(int argc, char **argv, char **env) {
while(true) {
fprintf(stdout, "input: ");
char *line = readline(NULL);
if(line) {
add_history(line);
}
}
return 0;
}
程序吐出提示,如果我输入如下内容:
input: foo bar baz
然后去擦除行,输入:也被擦除(一旦我输入了第一个字符)。有没有什么办法解决这一问题?我唯一能想到的就是 fflush(stdout)
但这没有用。
将提示告诉readline()
:
#include <readline/readline.h>
#include <readline/history.h>
int main(void)
{
char *line;
while ((line = readline("input: ")) != 0)
add_history(line);
return 0;
}
当您自己进行提示时,readline()
不知道提示的存在,因此在您擦除输入的最后一个字符(将光标移回开头)时错误地重新绘制线条线)。当它知道提示时,它不会删除它。
我正在用c写一个自定义的shell,遇到了一个奇怪的小bug,可以在下面的测试用例中看到:
#include <stdio.h>
#include <stdbool.h>
#include <readline/readline.h>
#include <readline/history.h>
int main(int argc, char **argv, char **env) {
while(true) {
fprintf(stdout, "input: ");
char *line = readline(NULL);
if(line) {
add_history(line);
}
}
return 0;
}
程序吐出提示,如果我输入如下内容:
input: foo bar baz
然后去擦除行,输入:也被擦除(一旦我输入了第一个字符)。有没有什么办法解决这一问题?我唯一能想到的就是 fflush(stdout)
但这没有用。
将提示告诉readline()
:
#include <readline/readline.h>
#include <readline/history.h>
int main(void)
{
char *line;
while ((line = readline("input: ")) != 0)
add_history(line);
return 0;
}
当您自己进行提示时,readline()
不知道提示的存在,因此在您擦除输入的最后一个字符(将光标移回开头)时错误地重新绘制线条线)。当它知道提示时,它不会删除它。