В реализации 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 ответ
Есть в основном три способа сделать это. В порядке убывания усилия:
- Переведите терминал в необработанный режим, чтобы можно было получать символы, такие как Ctrl-B и т. Д., А затем обрабатывайте их. Это действительно заново изобретать колесо, и если вы не хотите тратить много времени впустую (если не на обучение), не ходите туда.
- Поскольку это было решено сто раз и требуется многим программам, была разработана библиотека с именем termcap для абстрагирования возможностей терминала. Если вы хотите, чтобы ваша программа работала не только в xterm, но и на других терминалах, это путь.
Используйте библиотеку 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 также доступен.