如何在curses/C中使光标的行为类似于文本编辑器/终端?

3
例如,假设我有字符串“Hinge” - 我希望能够将光标移到开头,按del键删除“H”,并插入一个“B”,将光标前面的所有内容向前推送,创建单词“Binge”,而不是覆盖默认行为下的“i”。我可以使用标准的addch()函数来实现这一点吗?
此外,即使我能够正确地在屏幕上打印,似乎这个过程过于复杂,以至于难以对应到缓冲区。这似乎是一个常见的任务,但我想不出一个非hacky的方法来解决它。
以下是我目前处理基本输入的示例。
  if (isprint(key)) {
    if (ctx->pos != sizeof(ctx->line)-1) {
      mvwaddch(self->window, y, x, key);
      ctx->line[ctx->pos++] = key;
      ctx->line[ctx->pos] = '\0';
    }
  }

嗯,既然是C语言,不确定这是否是最佳方法,但您考虑过使用字符链表编写类和函数吗?您还可以设置标志,例如“插入”按钮以覆盖或仅添加另一个字符并将所有内容向前推。 - Danicco
1
考虑使用GNU readline库 - jxh
1个回答

1

您可以使用GNU readline library来完成这个任务,而不是直接编写到curses。下面是一个简单的程序:

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

int main () {
    char *s = readline("Type something: ");
    printf("You typed: %s\n", s);
    return 0;
}

在我的系统上,我使用gcc prog.c -lreadline -ltermcap进行了编译。

1
@JohnF:非常感谢。请记住,readline() 返回的字符串需要使用 free() 进行释放。 - jxh
进一步调查发现 curses 和 readline 不兼容。 - JohnF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接