2011-09-23 15 views
2

私はRubyプログラムでControl-Left、Shift-F10などをトラップしようとしています。通常、getchを使用すると、27,91,50,50,126などのintのリストが得られます。しかし、私はこれらがシステムや端末に依存する可能性があることを恐れています。グーグルで私はuse_extended_names、tigetstrなどについて見つけました。実行時にキーコードを検出するCプログラムを見つけました(Thomas Dickeyによる)。私はそれを実行し、それは拡張されたキーを発見するようだが、同じプログラム内のgetchは、とにかく私が取得しているC-leftの[27,91,53,68]のようなintの通常のリストを与える。私はそれが言及する一つの戻り値を得ると期待しています。拡張キーをトラップするncurses

何が欠けていますか?私はコントロール左を押すと、ここで

が出力されます。

keypress=27 
keypress=91 
keypress=53 
keypress=68 
key=kLFT5, code=540 
key=kEND5, code=525 
key=kHOM5, code=530 
key=kHOM3, code=528 
key=kUP5, code=561 
key=kDN5, code=520 

私は540を得ないでしょうか?ここで

がkeytest.cです:不思議なhttps://gist.github.com/1237091

TERM =スクリーンの下で実行している場合、すべてのコードが0を示しています。上記はTERM = xtermです。 (私は端末を使用してOSXを使用しています)

+0

サンプルプログラムを実行すると、3行が表示されます。tigetstr ...これらの行が表示されない場合は、端末の説明に問題があります。どのOSと端末を実行していますか? – Craig

答えて

2

Cursesは実際に端末で修飾語を実行する前に設計されていました。そのキーハンドリングモデルは事実上、値のフラットな列挙であり、任意のキー+モディファイアの組み合わせを簡単に処理することはできません。

これを解決するには、私はlibtermkeyを書いています。代わりにこれを使用する方が幸運かもしれません。それはPerlやPythonバインディングの両方を持っているものの

http://www.leonerd.org.uk/code/libtermkey/

それは、Cライブラリです。誰かがRubyバインディングを非常に簡単に作ることができるはずです。

+0

そのため、ncurses自身が制御を左に処理することはできませんか? –

+0

@AndriusBentkus - 正しい;できない。 – LeoNerd

0

ncursesはcontrol-shift-met-alt修飾子については知らないが、それは文字しか知りません。修飾語は、特定の端末が知っているものです。端末によっては、キーボード修飾子をホストに送信する文字でエンコードすることができます。例えば、xtermはこれを行うことができます。

terminfo(およびtermcap)には、少数の変更された特殊キー(シフトされた右矢印など)を含む特殊キー(カーソルキー、ファンクションキーなど)の事前定義リストがあります。定義済みのキーには、端末の説明に明確な名前があり、 xxxxの名前がcurses.hヘッダーにあります。 ncursesのは、特殊キー

  • (指定された入力文字列の名前を定義)に対応use_extended_names機能付きtic-xオプション

    のこれらのリストを拡張する2つの方法を提供します。
  • define_key関数(与えられた入力文字列に対してgetchによって返されるコードを割り当てます)。

ncursesターミナルデータベースは、カーソルキーと編集キーパッドに焦点を当てて、変更された特殊キーに最も有用な定義を提供します。 これでいくつかの問題があります:ポータブルterminfoの定義は4096バイトに制限されているので、

  • は端末データベースはすべての定義を提供していません。サイズに制限がなければ、xtermのキーボード関連のリソース設定の(文字通り)何千もの組み合わせごとに完全なテーブルを生成できると考えられます。
  • TERMからxtermに設定した端末は、xtermと同じ文字列を送信しません。 (実際には、ほとんどが異なりますが、いくつかは単に異なるものではなくサブセットです)。
  • 上記の例では、terminfoの文字列は\E[5Dになりますが、xtermの文字列の1つではありません。 (OPはこれが数年前からOSX Terminalであることを示していた - OSXの各リリースにはTerminalへの変更が含まれているが、OSX Terminalのリリースはまだxtermと全く一致していない)。それがxtermのように見えない理由は、修飾子(5)が第2の位置ではなく第1の位置に現れるためです。 xtermは2002年にそれを非難しました(patch #167)。
  • ファンクションキーは特記せずに質問に記載されています。 ncursesで使用されている規約では、(ほぼ標準の)12個のPCキーボードのファンクションキーに、シフトファンクションとコントロールモディファイアの4つの最も有用な組み合わせを割り当てて、48個のファンクションキーを取得します。 terminfoには60個のファンクションキーが定義されています。それらのための追加の既知の文字列がある場合、残りのダースが限界まで埋められます。

あまりにも、あらかじめ定義されたテーブルをterminfo(サイズと端子の問題が異なっているという問題)で作るために。 define_key関数はサイズに制限がなく、特殊なニーズを持つアプリケーションでは長い間利用可能でした。たとえば、最も一般的な端末の最も一般的な変形をマージすることによって、テーブルを構築するためにそれを使用することができます。

関連する問題