ncurses 到外壳并返回弄乱键

Posted

技术标签:

【中文标题】ncurses 到外壳并返回弄乱键【英文标题】:ncurses to external shell and back messing with keys 【发布时间】:2009-07-27 18:07:50 【问题描述】:

我有这个 ncurses 应用程序正在执行标准配方 暂时退出 ncurses,运行外部 editor/shell/whatever,然后在完成后返回到 ncurses。

这〜几乎可以工作,除了前几个按键ncurses 事后得到显然是假的; ncurses 认为 ^[ 和 A 被看到 如果我按两次向上箭头分别。

任何人都曾见过这种行为并且知道修复的魔法咒语 这是?如果有帮助的话,这就是 Ruby ncurses 库。

【问题讨论】:

【参考方案1】:

在查了一下之后,我找到了一个cargo culting 解决方案:在stdscr 上取出shell 后显式调用keypad(1)。我不知道为什么会这样,但确实如此。如果他们能解释原因,我会将其他人的答案标记为是。 目前的工作原理是键盘触摸某种内部缓冲区并将其清除。

从头开始:

NCURSES_EXPORT(int)
键盘(WINDOW *win,布尔标志)

    T((T_CALLED("键盘(%p,%d)"), win, flag));

    如果(赢)
        win->_use_keypad = 标志;
        returnCode(_nc_keypad(SP, flag));
     别的
        返回码(错误);

【讨论】:

【参考方案2】:

是的。如果没有键盘,ncurses 将无法为您处理转义码。从键盘手册页:

   The keypad option enables the keypad of the user's  terminal.   If  en-
   abled (bf is TRUE), the user can press a function key (such as an arrow
   key) and wgetch returns a single value representing the  function  key,
   as in KEY_LEFT.  If disabled (bf is FALSE), curses does not treat func-
   tion keys specially and the program has to  interpret  the  escape  se-
   quences  itself.   If the keypad in the terminal can be turned on (made
   to transmit) and off (made to work locally),  turning  on  this  option
   causes  the terminal keypad to be turned on when wgetch is called.  The
   default value for keypad is false.

通常,我在 ncurses 程序中做的第一件事是调用 keypad(stdscr, true) 来启用漂亮的键盘映射。

希望对您有所帮助。

【讨论】:

所以,我在这里不明白的是,为什么它会在两次击键后“修复”自己。

以上是关于ncurses 到外壳并返回弄乱键的主要内容,如果未能解决你的问题,请参考以下文章

使用 ncurses 而不安装它

Linux系统下安装ncurses库

在 ncurses 中使用数字键盘键

ncurses + SLD2 和 SDL2_Mixer:尝试播放 mp3 时没有声音

Ncurses 和 gdb 屏幕在调试时重叠。所以我想把两个屏幕分开

NCurses 从 stdin 读取到 std::string,C++