web-dev-qa-db-ja.com

端末でのシフト+キーアップ/ダウンの検出

どうすればよいですか? shift+upまたはshift+downが複数の行を選択するターミナルメニューが必要です。 ncursesに問題があるようです。

必ずしも高度な端末ライブラリは必要ありません。私はこれを処理したいだけで、それ以外は私のIOはかなり簡単なはずです。

何かアドバイス?

6
PSkocik

端末は、キーではなく文字を送信します。ほとんどの文字は印刷可能であり、ファンクションキーやキーコードをエンコードする余地はあまりありません。ファンクションキーは、エスケープシーケンス、つまりエスケープ文字で始まるバイトのシーケンスとしてエンコードされます(バイト値27。多くのプログラミング言語では\eとして書き出すことができます)。詳細については、 キーボード入力とテキスト出力はどのように機能しますか? を参照してください。

各キーまたはキーコードが送信するエスケープシーケンスに関する普遍的な標準はありません。 cursesライブラリは、ファンクションキーをデコードする抽象化レイヤーを提供します。 termcap (old-style)または terminfo (modern)ライブラリを内部で使用します。 cursesとリンクしたくない場合は、termcap/terminfoを直接使用できます。

または、通常の制御シーケンスをハードコーディングすることもできます。 Up そして Down。標準はありませんが、ほとんどすべての端末が\eOAまたは\e[Aを送信します Up および\eOBまたは\e[B Down、そして私はこれらのシーケンスを別のキーに送信する端末を見たことがありません。

の Shift キーコードは別の問題です。キーコードが送信するエスケープシーケンスはより多様であり、多くの端末は区別しません。 Up から Shift+Up。制限された構成のセットのみをサポートする場合を除き、これらが異なることに依存することはできません。 新しい標準があります しかし、それらはまだ多くの一般的なターミナルエミュレータでサポートされていません。

端末はキーアップイベントを送信しません。 (ただし、説明によれば、ユースケースではそれらは必要ありません。)

特定のターミナルエミュレータ(最近のxtermなど)を必要とする余裕がない限り、ユーザーが次のように入力できることに頼らないでください。 Shift+Up。 「複数選択の開始」キーの後にプレーンが続くなどの代替方法をサポートする Up/Down

質問の文脈から、_shift+up_および_shift+down_は_shift-cursor-up_および_shift-cursor-down_を参照します(たとえば、_shift-page-up_および_shift-page-down_ではなく) 、複数のの選択について質問されたため。

これは実際には複数の質問です。

  • まず、ncursesに_shift+up_などを認識させる方法、そして
  • ncursesメニューライブラリがこれを行うかどうか、および
  • そうでない場合は、それを行うメニューを取得する方法。

まず、ncursesは、移植可能な(多かれ少なかれ)特別なキーのセットに対して事前定義された(X/Open Cursesごとの)定義を提供します。 terminfo(5) を参照すると、次のことに気付くでしょう:

_   key_sf                    kind   kF   scroll-forward key
   key_sleft                 kLFT   #4   shifted left-arrow
                                         key
   key_sr                    kri    kR   scroll-backward key
   key_sright                kRIT   %i   shifted right-arrow
                                         key
_

しかし、「シフトされた上矢印キー」というラベルの付いたものはありません。 kindkrikLFTkRITに関連付けることができるのは、ある程度後知恵がある場合のみです。 1999年に変更された特殊キーのサポートをxtermに追加する前は、先行技術はほとんどありませんでした。

パッチ#94-1999/3/27-XFree86 3.9Pf
Shift、Control、またはAltが設定されているかどうかを示すパラメータをファンクションキーに追加します。コードは、JeffreyAltmanによるPCキーボードを備えたDECVT510の説明に基づいています。

その後、アプリケーションの混乱を減らすために、そのスキームが修正されました。 xtermから機能をコピーした他の開発者は、プログラムを修正することでそれに従わなかった。

パッチ#167-2002/8/24-XFree86 4.2.
modifyCursorKeysリソースを追加して、shiftおよび同様の修飾子を使用してカーソルエスケープシーケンスを作成する方法を制御します。デフォルトでは、変更されたエスケープシーケンスは常にCSIで始まり、最初のパラメーターを繰り返しカウントとして解釈するアプリケーションを混乱させないように、修飾子を2番目のパラメーターとして配置します。元の動作は、リソースを0に設定することで取得できます(Stephen J Turnbull、Jeffrey Altmanとのニュースグループディスカッション)。

一方、ncursesでは、これらを端末の説明に組み込むことが有用であるように見えました(ncursesは、たとえばtmuxが使用するようなテーブルよりも端末データベースを使用するため)。これらは ncurses 5. によって導入されたユーザー定義機能の機能に依存しています。端末データベースでは、この機能は 2004 でxtermについて言及されています。

_# 2004-07-17
#       * add xterm-pc-fkeys -TD
_

これは(早くも 2001 で以前の作業を統合することに加えて)、xtermリソースのさまざまな組み合わせで使用される可能性のある修飾子エンコーディングのバリエーション、およびさまざまな程度で異なる類似物に対処しようとしましたxtermエンコーディングスキームから。

ユーザー定義機能に使用される規則は、kDNkUPをリスト(_shift+down_と_shift+up_)に追加することから始まり、xtermに対応する番号修飾子コード。ずっと後に、kindkriが同じ意味を持つ可能性があることが明らかになりました。しかし、その結果、kDNkUPで端末の説明が見つかる場合があります(これは読み取りのみを実行します—端末データベースを直接読み取る他のアプリケーションやライブラリはこれを約16年間無視していました)。

拡張機能は ターミナルデータベース にまとめられています。

現在(2番目の部分から)、ncursesはメニューライブラリを提供します。これは(マルチバイト文字のサポートなどのいくつかの拡張機能を備えた)SVr4メニューライブラリの再実装です。 menu_driver(3x) のマニュアルページ、およびライブラリを示す ncurses-examples のプログラムを参照してください。簡単に言うと、メニューライブラリは、要求されている動作を事前に定義していませんが、アプリケーションはライブラリを使用して要求されていることを実行できます。この詳細の使用方法を確認することから始めます。

_REQ_TOGGLE_ITEM_
アイテムを選択/選択解除します。

より大きな問題は、このアプリケーションでユーザー定義機能を使用することによって発生する問題です。 form-libraryとmenu-librariesを使用するほとんどのアプリケーションは、特別なキーの事前定義された記号を使用してケースステートメントを作成することに依存しています。 _shift+up_と_shift+down_の場合、それはありません(kindkriの一致が記録され、適用されない限り)。ユーザー定義機能の場合、事前定義されたキーコードはありません(_KEY_DOWN_の_curses.h_など)。代わりに、 _key_defined_ 関数によって決定されるランタイム定義の値があります。したがって、単純なケースステートメント(が存在する_KEY_SDOWN_が_curses.h_にない)の代わりに、いくつかの間接参照が必要です。

7
Thomas Dickey

コマンドプロンプトからshowkeyまたは同様のツールを試してください。

矢印キーを押してから、Shift +矢印を押します。

たとえば、矢印とシフト+矢印の両方に^[[Aが表示された場合、ターミナルエミュレーターがシフト修飾子を無視しているだけだと思います。 3つの人気のあるターミナルエミュレータをテストしたところ、3つのうち2つがShiftキーを無視しました。

これは最善の答えではありませんが、シフト矢印の選択を可能にするJuppのようなエディターを使用する方がよい場合があります。

0
PJ Brunet