I’m new to the Gnu Readline library.
I need to call the readline()
function when the cursor is at the very last line of the console. But I need to prevent scrolling down when the Return key is pressed; so I’m looking for a way to prevent the output of the carriage return : I’m sure it’s possible, but can’t find the way to do it.
I tried to use my own rl_getc_function()
to trap the Return key (the example below traps y and z keys, but it’s just for test purposes) and treat this key in a special way:
- My first idea was to run the
accept-line
command directly, thinking it would not output a carriage return, but actually, it does - My second idea was to redirect the output to
/dev/null
before calling theaccept-line
command; but the redirection doesn’t seem to apply when thereadline()
function is already running.
Here is an example of my tests:
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
FILE *devnull; // To test output redirecting
int my_getc(FILE *file)
{
int c = getc(file);
// Let's test something when the 'y' key is pressed:
if (c == 'y') {
// I was thinking that calling "accept-line" directly
// would prevent the output of a carriage return:
rl_command_func_t *accept_func = rl_named_function("accept-line");
accept_func(1, 0);
return 0;
}
// Another test, when 'z' key is pressed:
if (c == 'z') {
// Try a redirection:
rl_outstream = devnull;
// As the redirection didn't work unless I set it before
// the readline() call, I tried to add this call,
// but it doesn't initialize the output stream:
rl_initialize();
return 'z';
}
return c;
}
int main()
{
devnull = fopen("/dev/null", "w");
// Using my function to handle key input:
rl_getc_function = my_getc;
// Redirection works if I uncomment the following line:
// rl_outstream = devnull;
readline("> "); // No freeing for this simplified example
printf("How is it possible to remove the carriage return before this line?n");
return 0;
}
I’m sure I missed the right way to do it; any help would be appreciated.
Advertisement
Answer
I found it : the rl_done
variable is made for this.
If I add this code to my my_getc()
function, it works well:
if (c == 'r') {
rl_done = 1;
return 0;
}
No carriage return is then inserted, and my next printf()
call displays just after the last char I typed.