bashのメタキーとは何ですか?


16

私が使用しようとxmodmapマッピングするためMETA_LMENUキーが、に受け入れられていないようですbashメタキーとして。ですから、これらのコンポーネント(キーボード、X、xterm、bash)がメタキーとスーパーキーに関してそれぞれにどのように関係しているか疑問に思っています。任意の説明をいただければ幸いです。

別の言い方をしましょう。たとえば、bashのマニュアルページには、関数yank-nth-argがバインドさM-C-yれており、を押すと機能することが記載されていEsc-Control-yます。しかし、これは少し面倒です。だから、どのようにbash がすべてのデフォルトのバインディングとしてMeta(などのMenu)別のキーを受け入れることができますか?


あなたのMENU鍵はXでも気づかれていますか?使用しているウィンドウマネージャ-それらのいくつかは、キーの再定義に役立ちます。
チョロバ

回答:


11

キーボードキーからXサーバーMetaなどの修飾子へのマッピングControl(つまり、GUIの低レベル部分)。このマッピングは、古いスタイルのxmodmapコマンドまたは新しいスタイルのXKBインターフェース、またはこれらのいずれかを内部で使用するGUI構成ツールを介して操作できます。

デフォルトでは、ほとんどのセットアップで、MetaキーはというラベルのキーAltです。これは、歴史的に、多くのUNIXワークステーションには、MetaPCにというラベルの付いたキーが付いていたためAltです。のバインディングがある場合は、+ +をM-C-y押します。CtrlAltY

現在のバインディングが何であるかを確認するにxevは、ターミナルでプログラムを起動します。xevウィンドウにフォーカスがある状態で、キーを押します。生成されたイベントのトランスクリプトがターミナルに表示されます。

端末エミュレーター(または物理端末に対応する端末デバイス)とアプリケーション間の通信は、文字を使用します。を押すAと、端末は「Aキー、修飾子なし」という情報を受け取りますが、端末で実行されているアプリケーションに送信するのは文字aです。Upまたはなどのファンクションキーを押すと、F1対応する文字はありません。端末は、エスケープ文字(バイト27、場合によっては書き込み\eまたは^[)で始まる文字シーケンスを送信します。xtermのような端末エミュレータがでキープレスイベントを受信するとMeta修飾子は、エスケープ文字にそのキーは、キーの基本的な機能、例えば続く翻訳\eaを押す(エスケープ、小文字のa)のMeta+をA

「端末」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?役に立つ背景かもしれません。


5

キーイベントはXサーバーによって生成され(で設定xmodmap)、Xアプリケーションに送信されます。ウィンドウマネージャは、xtermに送信される前にこれをインターセプトできます。XTermは、イベントをいくつかのバイトに変換し、そのバイトをシェルbashによって割り当てられた擬似ttyに送信します。

すべてのイベントがXTermによって直接バイトに変換されるわけではないことに注意してください。たとえば、Ctrlおよびshiftキーは、それ自体でXキーボードイベントを生成しますが、XTerm はその中で実行されているシェル(または他のアプリケーション)に何も送信しません。これにはMetaキー自体も含まれますが、キーは含まれませんMenu。ただし、Meta- eを押して生成されたイベントにより、XTermは、XTerm.VT100.metaSendsEscapeリソース設定に応じて、バイト0xE5または2バイトシーケンス0x1B 0x65を送信します。


2

Bashのメタキーは、元々このように定義されていました(lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

それはたまたまncursesxtermで解釈される方法です。いくつかのオプションこの機能を行うために設けられた端子(その点が普及しなかった端末のほとんどは、あなたがハードコード行動(とは非常に興味深い使用が発生します)。。terminfoのマニュアルページのドキュメントこれらの端末の能力:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

機能の説明:

端末にシフトキーとして機能する「メタキー」があり、送信される文字の8ビット目を設定している場合、この事実はで示されkmます。それ以外の場合、ソフトウェアは8ビット目がパリティであると想定し、通常はクリアされます。この「メタモード」をオンまたはオフにする文字列が存在する場合は、smmおよびとして指定できますrmm

Altキーに応答してエスケープ文字のプレフィックスを付ける別の機能が、一部のターミナルエミュレータに組み込まれました。Bash(実際にはreadlineライブラリ)は、2004年からの変更ログでその使用法を文書化します。

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

メタは、修飾キーの特殊なケースです。controlおよびのようにshift、別のキーと同時に押すと、そのキーを単独で押すのとは異なるものが表示されることを期待しています。Xは、キーのXイベントで渡される修飾子値にビットを割り当てることにより、修飾子キーを提供します。キーを押すことは、複数のXイベントにすることができます。Xは、修飾子を保持しながらこれらのイベントを結合するための関数を提供します。

Xは、キーボードに表示される各キーの記号も定義します。イベントを結合する関数の特別な処理により、他の値(Unicodeなど)を提供します。

しかし、「メタ」は特別なケースです。

Xアプリケーションにはmeta、慣例による場合を除き、キーはありません。Xには、メタキーまたはメタ修飾子の定義がありません。従来は、端末が探しAlt-keyおよび/またはに知られている修飾の一つxmodmap、例えば、mod2。後のxkb機能は、Altキーを見つけるための情報の別のレイヤーを提供することにより、物事を複雑にします(ただし、この説明と比べて改善はありません)。

もちろん、metaについて特に何xmodmapxkb知らないということを考えると、コンベンションはこれまでのところあなたを連れて行くことができます。たとえば、xtermは構成可能であり、すべてのユーザーが同じ方法でメタを構成するわけではありません。たとえば、リソースで使用されている場合など、意図したメタキーではない場合があります。別のキーはメタキーかもしれませんが、ユーザー(特にbashでエスケープシーケンスを使用しているユーザー)は、を押したときにエスケープ文字を送信したい場合があります。ただし、修飾子として構成されていない限り、それは発生しません。xtermはイベントを単独で結合しません。AlttranslationAlt

xtermにはいくつかのリソース設定があります(マニュアルページに記載されています)。

  • altIsNotMetaおよびaltSendsEscape2007年に追加)。
  • eightBitInput以来、2006のメタモードの元の意味に対応し、提供し、このために定義されたエスケープシーケンスがあるsmmrmm(セット/削除メタモード)端末機能は。
  • eightBitInputデコードされたUnicode値を未加工の入力バイトではなく128シフトすることにより、UTF-8を考慮するように2003年に修正されました。
  • metaSendsEscape1999年からの日付
  • eightBitInputは、よりずっと古いですmetaSendsEscape。X11R4(1989)以降、メタモード(8ビット目を追加)またはキーの前にプレフィックスを付ける選択肢が実装されましたescape。ただし、この機能は起動時に決定されました。初期化中にチェックされ、入力が8ビットを許可するか7ビットのみを許可するように設定されているかが判断されました。

一部の人々は2つ(8ビットとエスケーププレフィックス)を同一視し、後者をメタモードと呼びます。問題の観点に応じて、eightBitInputxterm のリソース設定は、実行可能なメタキーを取得するためのソリューションの一部です。

参考文献:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.