2009-05-22 9 views
1

こんにちは私はcursesを使って小さなコンソールアプリケーションを開発しています。Rubyキーボードイベント処理

ユーザーの入力を待つメインループセクションがあり、getstr関数を使用します。もちろん、ユーザーがenterキーを押すのを待ちます。

私は、上下のキー押下をキャプチャしたいと思います。これはgetstrではできないと思います。

どのようにすればいいですか?

編集:私は実行しているからSTDIN.getcのウィッヒブロックにアプリケーションを使用して試してみた、とgetchはdoesntのは、矢印キー

EDIT#2キャッチ:Windows上でこのコードをしようとイムを。 Curses.getchはLinuxで動作しているようですが、ウィンドウ上では上向きの矢印キーが送られません。

答えて

3

すぐにキーを押すように、ttyの "cbreak"モードを設定する必要があります。これをしないと、Unix端末処理システムは、改行が受信される(つまり、ユーザがENTERにヒットする)まで入力をバッファし、入力はすべてその時点でプロセスに渡されます。

これは実際にはRubyやcurses固有のものではありません。これはUnixのttyを走らせるすべてのアプリケーションが動作する方法です。

このモードを有効にするには、cursesライブラリcbreak()関数を使用してみてください。終了する前にnocbreak()に電話してオフにすることを忘れないでください!

1文字を読み取る場合、STDIN.getcは、その文字のASCIIコードのFixnumを返します。たぶんおそらく、STDIN.read(1)は、次の文字の1文字の文字列を返すので、より便利であることがわかります。

しかし、矢印キーを意味する「上/下」キーは実際には一連の文字であることがわかります。最近のほとんどのANSIのような端末エミュレータ(xtermなど)では、上矢印は "\e[A"(\eはエスケープ文字です)です。このようなことに対処するためのtermcap(端末機能)データベースがありますが、cursesを使ってそれらにアクセスすることはできますが、最初にこれらを直接解釈することで簡単に試すことができます。あなたは、最近ANSIコード以外のものを使って端末に入り込む可能性はあまりありません。

+0

答えは、今、私はcrmode関数は何を教えてくれますか? –

+0

私はcrmodeとnocrmodeについて聞いていませんでしたが、http://redmine.ruby-lang.org/issues/show/916によれば、彼らはcbreakとnocbreakのエイリアスです(バグが修正されたので)。 –

+0

次にcrmodeまたはcbrakを使用するのは同じものでしょうか! –

0

getstrではなくgetchを使用します。矢印キーについてのcurt sampsonのコメントも1文字ではないことが分かります。

+0

getchは矢印をキャッチしません。Tabだけです –

+0

矢印を押したときにESCをキャッチしますか?そうであれば、矢印キーを押したときに送信される3文字をすべて読み込んでいるとは限りません。それは矢をキャッチしていない –

+0

、値がLinuxで、これは私のために働い入力 –

関連する問題