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

时间:2014-08-14 23:34:17

标签: ruby curses arrow-keys

TL; DR

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

环境和问题描述

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

目前,向上箭头在我的程序中打印27,这似乎是我的键盘为正向键提供的正确ordinal value

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

应与Curses KEY_UP constant匹配。它不是,因此通过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

1 个答案:

答案 0 :(得分:4)

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

stdscr.keypad = true

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