внутренний буфер readline()

Используя GNU Readline:

Функция readline() отображает подсказку и считывает ввод пользователя.

Могу ли я изменить его внутренний буфер? и как этого добиться?

#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    char* input;
        // Display prompt and read input 
        input = readline("please enter your name: ");

        // Check for EOF.
        if (!input)
            break;

        // Add input to history.
        add_history(input);

        // Do stuff...

        // Free input.
        free(input);
    }
}

person Ikbel    schedule 26.12.2014    source источник
comment
Каков его внутренний буфер? Может у него его нет? Я не совсем понимаю, чего вы хотите добиться.   -  person Ulrich Eckhardt    schedule 26.12.2014
comment
используя стандартный std::cin, мы можем получить доступ к его внутреннему буферу, используя функцию rdbuf(). Я не знаю, возможно ли это при использовании readline()   -  person Ikbel    schedule 26.12.2014
comment
Сначала ознакомьтесь с документацией по редактированию командной строки.   -  person πάντα ῥεῖ    schedule 26.12.2014
comment
Пожалуйста, сотрите C++ из своего заголовка, в вашем вопросе нет ничего специфичного для C++!   -  person Hans Lub    schedule 26.12.2014


Ответы (1)


Да, можно изменить буфер редактирования readline, например. с помощью функции rl_insert_text(). Чтобы сделать это полезным, я думаю, вам нужно использовать немного более сложный "интерфейс обратного вызова" readline вместо поющей и танцующей функции readline() в вашем примере.

Readline поставляется с очень хорошей и полной документацией, поэтому я просто дайте минимальный пример программы, который поможет вам начать работу:

/* compile with gcc -o test <this program>.c -lreadline */

#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>

void line_handler(char *line) { /* This function (callback) gets called by readline
                                   whenever rl_callback_read_char sees an ENTER */ 
  printf("You changed this into: '%s'\n", line);
  exit(0);
}

int main() {
  rl_callback_handler_install("Enter a line: ", &line_handler);
  rl_insert_text("Heheheh...");    /* insert some text into readline's edit buffer... */
  rl_redisplay ();                 /* Make sure we see it ... */

  while (1) {
    rl_callback_read_char();       /* read and process one character from stdin */
  }
}    
person Hans Lub    schedule 26.12.2014
comment
Можно ли разместить линию ввода, прикрепленную к нижней части терминала? - person Ikbel; 26.12.2014
comment
@Kira San: в Readline нет зацепок, которые могли бы помочь вам в этом. Вы можете попробовать использовать ncurses, чтобы установить, например. различные окна на вашем терминале, включая область ввода внизу, но это будет непросто. Подробнее об этом (включая возможный выход) см., например. invisible-island.net/ncurses/ncurses.faq.html#readline_library - person Hans Lub; 26.12.2014
comment
Да, это непросто, поэтому я выбираю GNU Readline. Я задаю так много вопросов. Но есть ли функция, которая отменяет запрос ввода readline? - person Ikbel; 26.12.2014
comment
Да, но ответ слишком длинный для комментария, и я еще не нашел ответа на SO. Можете ли вы сделать это новым вопросом? - person Hans Lub; 26.12.2014
comment
Спасибо, вот мой новый вопрос: stackoverflow.com/questions/27661706/ - person Ikbel; 26.12.2014