Acontece que readline
não pode reconhecer se não está começando na coluna # 1 e, assim, parar de atrapalhar a saída anterior na linha.
A única maneira de lidar com isso é reconhecendo a coluna inicial nós mesmos, e mover para o início da próxima linha para baixo se a posição atual for não coluna # 1. Em seguida, ele sempre será iniciado a partir da coluna mais à esquerda, sem gerar uma nova linha desnecessária quando ela já estiver na coluna 1.
Podemos fazer isso para o "Terminal" padrão porque ele entende uma sequência de escape ANSI para consultar a linha atual & amp; coluna do terminal. A consulta é enviada por meio de caracteres para stdout
e a resposta é lida por caracteres inseridos pelo terminal em stdin
. Devemos colocar o terminal no modo de entrada "raw" para que os caracteres de resposta possam ser lidos imediatamente e não sejam ecoados.
Então aqui está o código:
rl_prep_terminal(1); // put the terminal into "raw" mode
fputs("3[6n", stdout); // <ESC>[6n is ANSI sequence to query terminal position
int row, col; // terminal will reply with <ESC>[<row>;<col>R
fscanf(stdin, "3[%d;%dR", &row, &col);
rl_deprep_terminal(); // restore terminal "cooked" mode
if (col > 1) // if beyond the first column...
fputc('\n', stdout); // output '\n' to move to start of next line
in = readline(prompt); // now we can invoke readline() with our prompt