1

curses を使用して小さなコンソール アプリケーションを開発しています。

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

上下とタブのキープレスをキャプチャしたいと思います。これはgetstrではできないと思います。

誰でもこれを行う方法を知っていますか?

編集: STDIN.getc を使用してアプリケーションの実行をブロックしようとしましたが、getch は矢印キーをキャッチしません。

編集 #2: Windows でこのコードを試しています。Linux では Curses.getch が機能するようですが、Windows では上向き矢印のキーが送信されません。

4

2 に答える 2

4

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

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

curses ライブラリcbreak()関数を使用して、このモードをオンにしてみてください。nocbreak()出る前に電話して電源を切るのを忘れずに!

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

ただし、「上/下」キーが矢印キーを意味する場合、実際には一連の文字であることがわかります。最近のほとんどの ANSI ライクなターミナル エミュレータ (xterm など) では、たとえば、上向き矢印は " \e[A" (\eエスケープ文字) になります。このようなことを処理するための termcap (端末機能) データベースがあり、curses を介してそれらにアクセスできますが、最初は、これらを直接解釈して実験するのが最も簡単であることに気付くかもしれません。最近では、ANSI コード以外を使用する端末に遭遇する可能性はほとんどありません。

于 2009-05-22T13:13:03.897 に答える
0

getstr ではなく getch が必要です。矢印キーが 1 文字ではないことについての curt sampson のコメントも参照してください。

于 2009-05-22T13:32:05.153 に答える