【问题标题】:Readline & NCurses, handle special keys and keys combinationsReadline & NCurses,处理特殊键和组合键
【发布时间】:2016-12-13 18:07:47
【问题描述】:

我正在为一个学生项目复制 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。

来自手册:

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

当一个可能是功能键开头的字符是 收到(在现代终端上,意味着转义字符), curses 设置了一个计时器。如果序列的其余部分没有进来 在指定时间内,角色通过; 否则,返回功能键值。为此,许多 终端在用户按下 转义键,转义返回给程序。

以下是我的想法:

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

感谢您的宝贵时间!

【问题讨论】:

    标签: c readline ncurses keypad libreadline


    【解决方案1】:

    这是多个问题。简要说明:

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

    【讨论】:

    • 谢谢!我想没有比这更好的人来回答我的问题了。我将使用 readline 功能。我所说的反向keypad 的意思是,给定一个功能键的标记,我可以在标记的起源处检索转义码序列。
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2012-05-27
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多