在 get_line 实现中,如何允许用户移动光标?

In a get_line implementation, how do I allow the user to move their cursor?

所以,我目前正在研究一个小的 shell。
我使用自己的 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 = '[=11=]';
    return linep;
}

基本上有三种方法可以做到这一点。按工作量递减顺序排列:

  1. 将终端置于原始模式,以便能够接收诸如Ctrl-B等字符,然后对其进行处理。那是在重新发明轮子,真的,除非你愿意花很多时间白做(除非是为了学习),否则不要去那里。
  2. 由于这个问题已经被解决了一百多次,而且许多程序都需要它,因此开发了一个名为 termcap 的库来抽象终端功能。如果您希望您的程序不仅可以在 xterm 中运行,而且还可以在其他终端上运行,这是可行的方法。
  3. 使用 GNU readline 库。来自其手册:

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

DESCRIPTION

readline will read a line from the terminal and return it, using prompt as a prompt. If prompt is NULL or the empty string, no prompt is issued. The line returned is allocated with malloc(3); the caller must free it when finished. The line returned has the final newline removed, so only the text of the line remains.

readline offers editing capabilities while the user is entering the line. By default, the line editing commands are similar to those of emacs. A vi-style line editing interface is also available.