如何让Ruby curses正确响应箭头键?

TL; DR

如何让Ruby curses正确响应箭头键? KEY_UP常量似乎与我的输入不匹配。

环境与问题描述

我正在使用curses 1.0.1 gem运行Ruby 2.1.2。 我正在尝试使用curses启用箭头键导航。 我已经启用Curses#getch来获取单个密钥,而无需通过调用Curses#cbreak来等待回车,这对于k字符工作正常。 但是,我真的想启用箭头键导航,而不仅仅是HJKL用于移动。

目前,我的程序中的向上箭头打印27,这似乎是我的键盘为up-arow键提供的正确的序数值 :

"^[[A".ord #=> 27 

哪个应该与Curses KEY_UP常量匹配。 它不是,因此通过else语句来显示序数值。 当ruby程序退出时,向上箭头键也会在命令提示符下将[ A作为两个单独的字符留下,这可能表示Curses#getch没有正确捕获按键。

我的Ruby代码

 require 'curses' include Curses begin init_screen cbreak noecho keypad = true addstr 'Check for up arrow or letter k.' refresh ch = getch addch ?\n case ch when KEY_UP addstr "up arrow \n" when ?k addstr "up char \n" else addstr "%s\n" % ch end refresh sleep 1 ensure close_screen end 

在启用键盘的行中,您实际上是在创建一个名为“keypad”的局部变量,因为该方法位于Curses::Window类中。 由于您没有制作自己的窗口(除了使用init_screen ),您可以使用stdscr方法引用标准窗口。 如果我将第8行更改为:

 stdscr.keypad = true 

然后你的示例代码适合我。