1

我正在使用 curses 开发一个小型控制台应用程序。

我有一个等待用户输入的主循环部分,它使用 getstr 函数,当然这等待用户按 Enter。

我想捕捉向上和向下和制表键的按键。我想这不能用getstr来完成。

任何人都知道如何做到这一点?

编辑:我试过使用 STDIN.getc 来阻止应用程序运行,而 getch 没有抓住箭头键。

编辑#2:我正在 Windows 上尝试此代码。似乎 Curses.getch 适用于 Linux,但在 Windows 上,我没有收到向上箭头的键。

4

2 回答 2

4

您需要设置 tty 的“cbreak”模式,以便立即获得按键。如果您不这样做,Unix 终端处理系统将缓冲输入,直到收到换行符(即,用户点击ENTER),并且输入将在此时全部交给进程。

这实际上不是 Ruby 或什至是特定于诅咒的;这是所有通过 Unix tty 运行的应用程序的工作方式。

尝试使用 curses 库cbreak()函数打开此模式。退出前别忘了打电话nocbreak()把它关掉!

对于读取单个字符,STDIN.getc将返回字符的 ASCII 码的 Fixnum。很可能您会发现STDIN.read(1)它更方便,因为它返回下一个字符的单字符字符串。

但是,您会发现“向上/向下”键(如果您指的是箭头键)实际上是一个字符序列。在当今大多数类似 ANSI 的终端仿真器(例如 xterm)上,例如,向上箭头将是“ \e[A”(即\e转义字符)。有 termcap(终端能力)数据库来处理这类事情,您可以通过 curses 访问它们,但最初您可能会发现直接尝试解释这些是最简单的;如今,您不太可能遇到使用 ANSI 代码以外的任何其他代码的终端。

于 2009-05-22T13:13:03.897 回答
0

你想要 getch 而不是 getstr。另请参阅 curt sampson 关于箭头键不是单个字符的评论。

于 2009-05-22T13:32:05.153 回答