2009-05-22 117 views
1

你好我使用curses來開發一個小的控制檯應用程序。紅寶石鍵盤事件處理

我有一個主循環部分等待用戶輸入,它使用getstr函數,當然這個等待用戶按回車。

我想捕捉上下和選項卡的按鍵。我想這不能用getstr來完成。

任何人都有任何想法如何做到這一點?

編輯:我使用STDIN.getc至極阻止運行的應用程序審理,殘培犯規趕上箭頭鍵

編輯#2:IM在Windows上嘗試這種代碼。看起來Curses.getch適用於Linux,但在Windows上,我沒有發送向上箭頭的密鑰。

回答

3

您需要設置tty的「cbreak」模式,以便立即獲得按鍵。如果你不這樣做,Unix終端處理系統將緩衝輸入,直到接收到一個換行符(即用戶點擊ENTER),並且輸入將全部交給進程。

這實際上並不是Ruby-甚至是curses特有的;這是通過Unix tty運行的所有應用程序的方式。

嘗試使用curses庫cbreak()函數打開此模式。不要忘記在退出之前致電nocbreak()將其關閉!

對於讀取單個字符,STDIN.getc將返回該字符的ASCII碼的Fixnum。很可能你會發現STDIN.read(1)更方便,因爲它返回下一個字符的一個字符的字符串。

但是,您會發現「上/下」鍵,如果您是指箭頭鍵,則實際上是一系列字符。在大多數類似ANSI的終端仿真器中(例如xterm),向上箭頭將爲「\e[A」(例如,\e是轉義字符)。有termcap(終端能力)數據庫來處理這類事情,你可以通過curses來訪問它們,但是從內在的角度來看,你可能會發現最簡單的做法就是試驗直接解釋它們;這些日子裏,你不大可能會使用ANSI代碼以外的任何其他終端。

+0

thx答案即時將嘗試,現在,順便說一句,你可以告訴我什麼crmode功能呢? – 2009-05-22 14:25:59

+0

我沒有聽說過crmode和nocrmode,但根據http://redmine.ruby-lang.org/issues/show/916,他們只是cbreak和nocbreak的別名(現在該bug已修復)。 – 2009-05-23 04:55:56

0

你想getch而不是getstr。還請看curt sampson關於箭頭鍵不是單個字符的評論。