ターミナルでShift +キーアップ/ダウン検出

ターミナルでShift +キーアップ/ダウン検出

どうすればいいですか?複数行を含めるかshift+up選択するターミナルメニューが必要ですshift+downncurses問題があるようです。

必ずしも高レベルの端末ライブラリが必要ではありません。私のIOが非常に単純でなければならないこと以外は、この問題に対処したいと思います。

どんな提案がありますか?

答え1

質問の文脈で複数の項目を選択する方法を尋ねる質問なので、および(たとえば、代わりに)を参照しshift+upてください。shift+downshift-cursor-upshift-cursor-downshift-page-upshift-page-downワイヤー

これは実際には1つ以上の質問です。

  • まず、ncursesを認識する方法shift+upなど
  • ncursesメニューライブラリがこれを行うかどうか
  • そうでない場合は、これを行うためのメニューをどのように取得しますか?

まず、ncursesは移植可能な(やや少ない)特別なキーセット用に事前定義された(X / Open Curses別)定義を提供します。引用する用語情報(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

しかし、「上矢印キー」と表示されているものはありません。遅れた判断だけがkind調和kriと調和をkLFT結ぶことができますkRIT。 1999年に修正された特殊キーのサポートがxtermに追加される前は、従来の技術はほとんどありませんでした。

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

後でアプリケーションの混乱を減らすためにスキームが修正されました。 xtermからこの機能をコピーした他の開発者は、自分のプログラムに従うように変更しませんでした。

パッチ #167 - 2002/8/24 - XFree86 4.2.0
modifyCursorKeysShiftと同様の修飾子を使用してカーソルエスケープシーケンスを生成する方法を制御するリソースを追加します。デフォルトでは、変更されたエスケープシーケンスは常にCSIで始まり、修飾子を2番目の引数として使用して、最初の引数を反復回数として解釈するアプリケーションの混乱を防ぎます。リソースを0に設定すると、元の動作が得られます(Stephen J Turnbull、Jeffrey Altmanとのニュースグループの議論)。

また、ncursesではこれを端末記述に組み込むことが役に立ちます(ncursesはtmuxで使用されるテーブルではなく端末データベースを使用するためです)。これは、次によって導入されたユーザー定義関数の機能に依存します。ncurses 5.0。ターミナルデータベースでは、この機能はxtermに記載されています。2004年:

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

その中には(早ければ除く)2001年)は、xtermリソースのさまざまな組み合わせで使用できる修飾子エンコーディングのバリエーションと、xtermエンコーディングスキームとの程度が異なる同様のコンテンツを処理しようとします。

ユーザー定義関数の規則は、最初にxterm修飾子コードに対応する番号とkDNリストkUP(yourshift+downと)に追加することです。ずっと後、それは同じ意味を持つことができることがshift+upわかりました。しかし、結果として端末記述を見つけることができます(ncurses読み取りのみ可能 - 端末データベースを直接読み取る他のアプリケーションやライブラリは約16年間これを無視しました)。kindkrikDNkUP

拡張機能は次のとおりです。端末データベース

これで(パート2)、ncursesはメニューライブラリを提供します。これはSVr4メニューライブラリの再実装です(マルチバイト文字サポートなどのいくつかの拡張を含む)。マンページを参照してください。menu_driver(3x)この目的のためにncurses - 例図書館を表示します。簡単に言えば、メニューライブラリはユーザーが要求する動作を事前定義しませんが、アプリケーションはライブラリを使用して要求されたアクションを実行できます。まず、この詳細を使用する方法を見てください。

REQ_TOGGLE_ITEM
項目を選択/選択解除します。

このアプリケーションでカスタム関数を使用すると、より大きな問題が発生します。フォームライブラリとメニューライブラリを使用するほとんどのアプリケーションは、Caseステートメントの特殊キーを使用して事前定義されたシンボルに依存します。なぜならshift+up、あなたshift+downはこれを持っていないでしょう(そしてそのkind偶然がkri発見され適用されない限り)。カスタム機能の場合、事前定義されたキーコード(例:KEY_DOWNMedium)はありませんcurses.h。代わりに、ランタイムによって決定される値があります。key_defined機能。したがって、簡単なケースの説明の代わりに(以下があります。)はいKEY_SDOWNcurses.h、いくつかの間接参照が必要です。

答え2

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

キーまたはキーコードごとに送信されるエスケープシーケンスの普遍的な標準はありません。 cursesライブラリは、ファンクションキーをデコードするための抽象化レイヤを提供します。それを使う用語キャップ(旧スタイル)または用語情報(現代)低レベルライブラリ。カースに接続したくない場合は、termcap / terminfoを直接使用できます。

Upまたは との共通制御シーケンスをハードコーディングできますDown。標準はありませんが、ほとんどすべての端末が\eOAor \e[AforUpおよび another\eOBまたは\e[Bfor を送信し、端末が他のDownキーに対してこれらのシーケンスを送信することを見たことはありません。

キーとコードShiftは別の話です。彼らが送信するエスケープシーケンスはより多様であり、多くの端末は例えばUp+Shiftを区別できませんUp。制限された構成セットのみをサポートしない限り、構成が異なるとは信じられません。新しい標準ただし、広く使用されている多くの端末エミュレータはまだそれをサポートしていません。

端末はキーイベントを送信しません。 (ただし、説明によると、ユースケースには必要ありません。)

特定の端末エミュレータ(最近のxtermなど)に余裕がない場合は、ユーザーがShift+を入力できることを期待しないでくださいUp。 「複数選択の開始」キーの後に、通常Up/などの選択肢をサポートしますDown

答え3

showkeyコマンドプロンプトで同様のツールを試してください。

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

たとえば、^[[A矢印キーとShift +矢印キーを同時に押すと、端末エミュレータがShift修飾キーを無視していることを示しているようです。今人気の3つの端末エミュレータをテストしましたが、そのうち2つはShiftキーを無視しました。

これは最善の答えではありませんが、Jupp矢印選択を移動できるエディタを使用するのに役立ちます。

関連情報