如何使Ruby curses正常响应箭头键?

3

TL;DR

如何使Ruby curses响应箭头键?KEY_UP常量似乎不能匹配我的输入。

环境和问题描述

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

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

"^[[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
1个回答

4

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

stdscr.keypad = true

你的示例代码对我有效。

这似乎是有效的,但我不确定为什么* keypad = *设置器需要显式接收器,而其他方法都没有,当我不必限定Curses :: Key :: KEY_UP时。记住,我使用了include Curses。那么为什么#keypad = 在这方面似乎是独特的呢? - Todd A. Jacobs
抱歉,我很久没有使用curses了(而且当我使用时,并不是用ruby),所以我无法回答你的问题:( - Tim Peters
我会接受你的答案,因为它解决了我的即时问题。希望其他人能在未来某个时候帮助我们弄清“为什么”。感谢你的快速解决方案! - Todd A. Jacobs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接