В реализации get_line, как я могу позволить пользователю перемещать свой курсор?

Итак, я сейчас работаю над небольшой оболочкой.
Я получаю пользовательский ввод с моей собственной реализацией getline, которая многократно вызывает fgetc(stdin) и перераспределяет для чтения строки.

Как разрешить пользователю использовать левую и правую клавиши для перемещения курсора на вводе, который он в данный момент пишет?

Функция:

#define LINE_BUFSIZE 256
static char *get_line(void)
{
    char  *line   = malloc(LINE_BUFSIZE);
    char  *linep  = line;
    size_t lenmax = LINE_BUFSIZE;
    size_t len    = lenmax;
    int    c;

    if (!line)
        return NULL;

    for (;;) {
        c = fgetc(stdin);
        if (c == EOF)
            break;

        if (--len == 0) {
            len = lenmax;
            lenmax *= 3;
            lenmax /= 2;
            char *linen = realloc(linep, lenmax);

            if (!linen) {
                free(linep);
                return NULL;
            }

            line  = linen + (line - linep);
            linep = linen;
        }

        if ((*line++ = c) == '\n')
            break;
    }
    *line = '\0';
    return linep;
}

1 ответ

Решение

Есть в основном три способа сделать это. В порядке убывания усилия:

  1. Переведите терминал в необработанный режим, чтобы можно было получать символы, такие как Ctrl-B и т. Д., А затем обрабатывайте их. Это действительно заново изобретать колесо, и если вы не хотите тратить много времени впустую (если не на обучение), не ходите туда.
  2. Поскольку это было решено сто раз и требуется многим программам, была разработана библиотека с именем termcap для абстрагирования возможностей терминала. Если вы хотите, чтобы ваша программа работала не только в xterm, но и на других терминалах, это путь.
  3. Используйте библиотеку readline GNU. Из его руководства:

    #include <stdio.h>
    #include <readline/readline.h>
    #include <readline/history.h>
    
    char *
    readline (const char *prompt);
    

ОПИСАНИЕ

readline прочтет строку из терминала и вернет ее, используя подсказку в качестве подсказки. Если запрос имеет значение NULL или пустую строку, запрос не выдается. Возвращенная строка выделяется malloc(3); звонящий должен free это когда закончено. В возвращенной строке удален последний символ новой строки, поэтому остается только текст строки.

readline предлагает возможности редактирования, пока пользователь входит в строку. По умолчанию команды редактирования строк аналогичны командам emacs. Интерфейс редактирования линии в стиле vi также доступен.

Другие вопросы по тегам