2

我正在为学生项目复制Irssi 界面。我想将NCurses用于文本界面,并使用 readline在编写消息时提供更好的文本编辑功能。

这个问题答案项目为我提供了一个很好的起点。

我的问题是我想要一个像这样的输入/事件循环:

int ch;
while (exit_condition) {
    ch = wgetch(window);
    switch (ch) {
    case ERR: continue;
    case KEY_F(1): /* do something */ break;
    case KEY_UP: /* do something else */ break;
    default: forward_to_readline(ch); break;
    }
}

但是为了匹配KEY_F(n)或者KEY_UP我需要启用keypad(window, TRUE),这将修改输入并使其无法用于 readline。

从手册:

如果 keypad 为 TRUE,并且按下了功能键,则返回该功能键的标记而不是原始字符。

当接收到可能是功能键开头的字符时(在现代终端上,这意味着转义字符),curses 设置一个计时器。如果序列的其余部分没有在指定时间内进入,则字符通过;否则,返回功能键值。由于这个原因,许多终端在用户按下退出键和退出返回到程序之间存在延迟。

以下是我的想法:

  • 有没有反转效果的功能keypad
  • 我应该实现自己的行为keypad吗?我想如果我想捕捉像 Shift + Up 这样的事件,我也必须这样做。我很高兴有这样的例子。
  • 如果我无法从 NCurses 获得它,readline 可以给我组合键吗?也许与键绑定callbacs(相关?)?

感谢您的时间 !

4

1 回答 1

4

这是多个问题。简要地:

  • keypad函数的反面是通过将参数设置为给定窗口调用该函数FALSE
  • 一些应用程序实现了他们自己的keypad/版本wgetch,但是(假设您可以使用 ncurses' 控制超时ESCDELAY),除非您想移植到 Solaris 诅咒,否则那里没有太多收获。
  • 例如,您不会使用shift + up得到任何改进(这是一个依赖于终端的转义序列)
  • readline 不会查看终端数据库中列出shift + up的功能(它不在它所知道的 termcap 的子集中)。它可以为您做的是将字符串与 readline 函数相关联。
于 2016-12-13T21:16:01.517 回答