Readline& NCurses,处理特殊键和键组合

时间:2016-12-13 18:07:47

标签: c readline ncurses keypad libreadline

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

questionanswerproject为我提供了一个很好的起点。

我的问题是我希望有一个像这样的输入/事件循环:

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。

从手册:

  

如果键盘为TRUE,并且按下了一个功能键,则表示该标记   返回功能键而不是原始字符。

     

当一个可能是功能键开头的字符时   收到(在现代终端上,表示逃脱字符),   curses设置一个计时器。如果序列的其余部分没有进入   在指定的时间内,角色通过;   否则,返回功能键值。出于这个原因,很多   终端在用户按下时间之间经历延迟   转义键并将转义返回给程序。

以下是我的想法:

  • 是否有反转keypad
  • 效果的功能
  • 我应该自己实现keypad的行为吗?我想如果我想捕捉像Shift + Up这样的事件,我也必须这样做。我很高兴有这方面的例子。
  • 如果我不能从NCurses获得密钥,那么readline会给我组合密钥吗?也许使用键绑定callbacs(relevant ?)?

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

这是多个问题。简言之:

  • keypad功能的反面是通过调用参数设置为 FALSE 的给定窗口。
  • 某些应用程序实现了自己的keypad / wgetch版本,但是(假设你可以用ncurses'ESCDELAY来控制超时),除非你有很多好处想要移植到Solaris curses。
  • 你不会通过 shift + up 获得任何改进(例如,这是一个依赖于终端的转义序列)
  • readline没有查看终端数据库中列出 shift + up 的功能(它不在它知道的termcap的子集中)。它能为你做的是将字符串与readline函数相关联。