GNU画面「コマンド文字」を定義するための包括的な可能性セットを提供する方法は?

GNU画面「コマンド文字」を定義するための包括的な可能性セットを提供する方法は?

私は標準的な既製の「USキーボード」と特定の端末エミュレータの両方にGNU画面「コマンド文字」を設定するすべての可能な方法を備えた包括的な「メニュー」を生成したいと思います。xfce4端末

私はこの可能性の世界が3つのリストに分類されると想像しています。

  • リストescape: ディレクティブの可能なすべての値
  • リスト第二<CODE>:式のパラメータに可能なすべての値bindkey -k <CODE> commandと「空の設定」(つまり、ディレクティブを使用しない.screenrc設定bindkey -k <CODE> command
  • リスト:ランダムペア(、 第二)(どこ ε 第二 ε 第二)へ入力方法の明示的な説明標準のUSキーボードの対応するGNU画面コマンド文字と特定の端末エミュレータ(IOW、「押すと同時に押す」Ctrlと同じ\)を想定します。

しかし、これらの規範は誰かが私の真の「最善の努力」であることを覚えておいてください。基本的な基本を理解していない。私はそれらを望むするこれらの基本を理解することで、「行間を読んで」問題の精神を維持しながら、必要に応じてこれらの仕様を変更することができます(参照背景)問題をより簡単に処理できるようにします。

私が望む「メニュー」がかなり大きくなることに気づきましたが、標準的なアメリカのキーボードのキー数は限られており、大きくなく、指セットがあるのでそれほど面倒ではないと思いました。この目的に使用できることははるかに真実です。 (重要な場合は、それぞれ最大3つのキーを持つ最大2つの連続した「メインコード」で構成されるキーの組み合わせにのみ興味があるとさらに指定できます。「メインコード」は、「メインコードの数を設定することを意味します。 . キーを同時に押しました。」)。


背景

(別名tl;博士)

この質問は、実際にはギルズのコメントに対するフォローアップです。以前に開始したスレッド。そのレビューで述べた内容の多くが私の理解を超えていることがわかりました。私はここの基本について私の理解に大きなギャップがあると思います。実際には大きすぎて、それを埋めるほど明確な質問を定式化することもできません。

Ctrl簡単に言えば、たとえば、+キーの組み合わせは\GNU画面の「コマンド文字」を入力するために使用できますが、(おそらく)Ctrl+などの他の同様のキーの組み合わせ'は使用できないこと私にとって大きな謎です。

私のようなユーザーが基本的な基本を明確に理解していない場合、適切なGNU画面コマンド文字検索は一連の孤立した提案です(Ctrl+どうですかH?結局のところ、誰もそれを他の目的に使用しません。”)、ユーザは許容可能な結果が現れるまで順番に評価する。

この一連の推奨事項と評価を継続する必要がある期間は、そのユーザーが許可できるキーの組み合わせセットのサイズによって異なります。明らかに、このサイズはユーザーによって異なります。私の場合は平均より小さいようで、このアプローチではまだ許容可能なGNU画面「コマンド文字」を提供できませんでした。

それにもかかわらず、このアプローチは本質的に非効率的であると考えられています。私にとっては、明確に定義された可能性の「宇宙」(つまり、「完全な集合」)から最良のオプションを選択できることがより合理的です。それが私がここで達成しようとしていることです。


編集する:\0001さて、いくつかの研究の終わりに、そして(含む)の間\0177のASCII範囲で(1バイト)文字を入力する方法を明確に理解することができました。これには、すべての「実際の」「制御文字」が含まれます。

また、私の考えのリストは\0001は、との間にあるすべての可能な整数のペアとして記述できますが\0377、これらのペアの多くは完全に非実用的であるとは限りません。 (たとえば、ペアの最初の要素は、「e」または「8」などの一般的な「印刷可能な文字」です。)

私はまだ次のことを見つけようとしています。

  • \0200ASCIIの範囲\0377(含む)から(1バイト)の文字を入力する方法は、端末と端末エミュレータの間にわずかな違いがあると予想されますが、現時点ではこれらの違いがどれほど混乱しているかわかりません。キャラクター実質的な合意に達しましたか?それでは、この文字が何であるか(そしてどのように入力するのか)知りたいです。

  • リストの有用な値を取得する方法第二;これらの値がコードであることを知っています。ここで難しいのは、便利なキーの組み合わせにきちんとマッピングされているコードをtermcap識別する方法がないことです。コードは単一のキーにマップされます。そのような明確な接続はありません。termcapF2F12termcap

  • リストを完成する方法、さらに特定の端末エミュレータの場合、リストに「空の設定」がある第二


1お願いします、この謎を私に説明しようとしないでください。知識が豊富で忍耐強い人が多かったが、まだ理解していない。何が起こっているのかを知っている人と私との間の「知識のギャップ」が大きすぎて、彼らが解決しようとする質問と同じくらい彼らの答えは常に私を慌てさせました。私がこの記事で手に入れたいのはこのような巨大な知識のギャップを解消、本質的に問題を規定された有限の可能性の集合を構成するアルゴリズムの検索として扱うことで、基本基本事項の知識がない人でもアルゴリズムを実装することができます。

ベストアンサー1

この質問に対する答えを理解するには、キーボード入力の処理方法をある程度理解する必要があります。ぜひ行ってみてください。キーボード入力とテキスト出力はどのように機能しますか?背景。この回答では、関連する部分を異なる方法で説明しますが、以前の回答で一般的なフレンドリーさがあるとします。

ここで私の答えは一般的なUNIXシステムを意味します。 UNIXシステムではない場合は、異なる動作をすることができます。私はあちこちでいくつかの単純化を行います。追加の複雑さは、この質問に答えることとは関係ありません。 (この回答は十分に複雑です。)

端末ベースのアプリケーションと端末(ハードウェアまたはソフトウェア)との間の通信を含むほとんどの通信および記憶は、バイトストリームの形をとります。 ㅏバイトこれは256の異なる値を持つことができる情報単位であり、8つの部分に分けることもできます。少し。バイトは 0 ~ 255 の数字で表されます。

情報を送信するには、当事者はその情報をバイトでエンコードする方法に同意する必要があります。文字ストリームをバイトストリームにエンコードする方法はいくつかありますが、すべての方法は以下に基づいています。ASCIIコード何らかの形で。 ASCIIは、0から127の間の7ビット値と128文字のセットの間の対応を定義します。これにより、各バイトに未使用ビットが残ります。この128文字は2つのカテゴリに分けられます。

  • 印刷可能な95文字:文字(A〜Z、小文字、大文字)、数字(0〜9)、スペース、一部の句読点。
  • 33制御文字

制御文字は、「カーソルを次の行に移動する」、「ベルを鳴らす」、「待つ」、「こんにちは」など、端末に送信されるか、端末から送信されるコマンドおよび補助情報をエンコードします。端末ユーザーが制御文字を入力できる「Control」(または単に「Ctrl」)というラベルの付いたキーが導入されました。端末の電子機器を簡単に保つためにCtrlキーを押すと、通常、文字が送信するバイト値で簡単なビットマスクが実行されます。たとえば、バイト 65 (バイナリの場合は 1000001) で表される文字を送信し、A+ バイト値 1 (バイナリの場合は 0000001) で表される文字を転送する場合、通常、次のように作成される "control-A" 文字を使用します。ACtrlA^A

ほとんどの制御文字は大文字に対応し、ビットパターンは10xxxxxで、ビット6は1ではなく0に設定されます。これは26に達します。追加の6つの制御文字は句読点文字に対応し、10xxxxx形式のビットパターンも持ちます@[\]^_ASCII印刷可能文字表。 0〜31の範囲に加えて、127文字の制御文字です。これを「control-?」( ?0111111、control-? は 1111111) といいます。

長年にわたって非ASCIIバイト値には異なる意味が割り当てられています。世界は一方向に収束しているUnicode誰もが欲しいすべてのキャラクターのコレクションです。 Unixの世界(そしてインターネット)はほとんど標準化されています。UTF-8文字をバイトシーケンスにエンコードする方法です。 UTF-8は、0から127の範囲のすべてのバイトにASCIIと同じ文字を割り当て、128から255の範囲の2から4バイトのシーケンスを使用して、約100万の異なる文字との互換性を示すことによってこれを維持します。 Unixの世界では、いくつかの異なる文字エンコーディングが使用されます。ほとんどはASCIIに基づいており、128以上のバイトに対して異なる意味を持ちます。

今後の質問の1つに答えることができます。

\0200ASCII範囲(1バイト)の文字を入力する方法\0377

これは使用する文字エンコーディングによって異なります。最も一般的なUTF-8を使用している場合、これらの個々のバイトは単一文字を表す2〜4バイトのシーケンスの一部としてのみ使用されるため、転送できません。

については

リストAescape: ディレクティブの可能なすべての値

これは単なるバイト値です。このescape命令には2バイトのパラメータが必要です。 Screen が端末から最初のバイト値を受け取ると、Esc キーが押されたと判断します。端末から送信された次のバイトが設定escapeの2番目のバイトである場合、Screenは最初のバイトをScreenウィンドウ内で実行されているアプリケーションに送信するかどうかを決定します。

説明bind注文するScreenが理解できる方法でバイト値を指定する方法について説明します。文書に「文字」と書かれている場合は、代わりに「バイト」を読んでください。

リストBに入る前に、まずコアコードを理解する必要があります。キーコードは、などの修飾子でキーを押すことCtrlですShift。以前は、端末から送信されたすべての情報がバイトストリームにエンコードされていることを確認しました。簡単にするために、印刷可能なすべての文字は標準的な方法でエンコードされます。つまり、ASCII文字の場合は32〜126の範囲のバイトで、その他の文字の場合は128〜255の範囲のバイトでエンコードされます。これにより、ファンクションキーをエンコードする制御文字以外の修飾子を持つ文字のみが残りますShift。しかし、制御文字は33個だけです!

一部のファンクションキーは制御文字を送信します。たとえば、バイト9はプリンタが次のタブ列に移動するように指示するTAB制御文字であるため、Tabkeypressは(バイト値9)を送信します。^IキーReturnが送信されます^M(バイト値13)。バイト 13 は、プリンタにヘッダーを行の先頭に移動するように指示する CR 制御文字であるためです。同様の理由でEscape送って^[送ったりBackSpace、歴史的な乱れのためここに入らないようにします^H^?

ほとんどのファンクションキーとキーとキーエスケープシーケンス: バイト 27 から始まるバイトシーケンス、エスケープ文字(ESC) は ASCII として定義され、^[(control-[) です。他の端末は異なるエスケープシーケンスを送信します。。標準がありますが、すべてのキーとコードのエンコーディングを定義するわけではなく、ある程度の競争基準があります。

これで私たちは理解する準備が整いました。

リストB<CODE>:式のパラメータに可能なすべての値bindkey -k <CODE>

これスクリーン文書このコードは次のように説明してください。用語キャップキーボード機能名。 Termcapは、アプリケーションが端末間の違いを抽象化するために使用できるプログラミングライブラリです。 (今はほとんど交換されましたが、用語情報.) Termcap データベースには、行番号と列番号 (Termcap が表示される場合、端末はハードウェアデバイスであり、サイズ変更の概念は適用されません)、バイトシーケンス (通常は ESC で始まる)、アプリケーションなどの端末に関する情報が具体的に含まれます。されています。カーソルの移動、画面の消去などの操作や、さまざまなキーを押して送信された一連のバイトを実行するために使用できます。 Termcapは、後で使用できるファンクションキーにシンボル名を提供しますbindkey -k

これタンキャップマニュアルこのデータベースのすべてのエントリを一覧表示します。これらの項目は両方とも2文字の名前を持っています。 FreeBSD マニュアルはまた、各項目に対してより表現力のある名前を提供します。最初の列に FreeBSD によってリストされる項目は、ファンクションキーを記述する項目です。 for、for、forなど2番目の列の名前。key_SOMETHING<CODE>bindkey -kklLeftk1F1F1F11

データベースに多くのキーとコードがありません。このデータベースにキーまたはコードのエントリがない場合、キーに使用できる名前はありませんbindkey -k。サポートされるキーセットは、UNIX のバリエーションによって異なります。

bindkeyエスケープシーケンスも渡すことができます。この機能を使用するには、目的のキーとコードについて端末がどのように送信するかを知る必要があります。異なる端末が同じキーとコードに対して異なるエスケープシーケンスを送信しても、幸いにもエスケープシーケンスとキーコードの間にあいまいさはほとんどありません。異なる端末の異なるキーコードに対応するエスケープシーケンスはほとんどない。

Ctrl+キーを押してからキーコードを押すと、キーコードから送信されたエスケープシーケンスを確認できますV。デフォルトモードの端末とすべての通常のシェルのコマンドラインでは、Ctrl+はV「次のバイトを文字通り解釈する」ことを意味します。後にエスケープシーケンスが続くと、エスケープシーケンスの解析を開始する代わりに、ESCバイトが文字通り挿入されます。エスケープシーケンスはほとんど常にESCの後に印刷可能な文字で構成されているため、文字通りエスケープシーケンスを効果的に挿入します。たとえば、Ctrl+を押しVてからCtrl+を押すと、LeftエスケープシーケンスCtrl+の送信内容を確認できます。 ESC制御文字の視覚的表現がどこにあるかをLeft確認できます。 (端末から別のエスケープシーケンスを再送信することもできます。)^[O5D^[

null 設定の場合、Screen が ESC バイトを読み取ると、エスケープシーケンス解析モードに入ります。各新しいバイトは、累積エスケープシーケンスに追加されます。累積シーケンスにリンクされたバインディングがある場合、Screenはエスケープシーケンス解析モードを終了してバインディングを開始します。累積シーケンスが連結されたバインディングを持つシーケンスのプレフィックスではない場合、Screenはエスケープシーケンス解析モードを終了し、累積シーケンスを削除します。したがって、ここでnull設定は「何も起こらない」という複雑な形式です。

これらすべての作業が完了したら、次に進みます。

リストC:ランダムペア(第二)(どこε第二ε第二) は、標準の US キーボードで対応する GNU 画面コマンド文字を入力する方法を明示的に説明し、特定の端末エミュレータの使用を想定しています。

上からヒントをいただいたように、特定の端末エミュレータここで重要な点:さまざまな端末はさまざまな方法でキーとコードをエンコードし、一部の端末はさまざまな方法で構成できます。このマッピングは(第二):×第二興味深いコレクションではありません。ほとんどのキーとコードは次にマップされます。誰でも印刷可能な文字(上記のように拡張))またはエスケープシーケンス(上記のように拡張されます。第二)。つまり、マッピングは親セットに対するものです。第二

残念ながら、多くの端末は、エスケープシーケンスを送信する方法を完全に文書化しません。幸いなことに、これはほとんど必要ありません。エスケープシーケンスからキーコードに移動せず、キーコードからエスケープシーケンスに移動します。これは、前述したようにCtrl+を用いて端末別に判断することができる。V

一部の端末、特にxtermは、体系的な方法でキーコードをエンコードするように設定できます。バラより端末使用時のキーバインディングの問題Emacsについての議論。残念ながらvteライブラリは含まれていません。特に、GNOMEの世界の多くの端末エミュレータで使用されています。

おすすめ記事