xmodmap
map META_Lto keyを試してみましたが、メタキーとしてMENU許可されていないようです。bash
それで、これらのコンポーネント(キーボード、X、xterm、bash)がメタキーとスーパーキーの側面でどのように関連しているのか疑問に思います。どんな説明でもよろしくお願いします。
別の言葉で表現します。たとえば、bashのマニュアルページでは、yank-nth-arg関数がバインドされていてを押すとM-C-y機能することを示していますEsc-Control-y。ところがこれがちょっと困ったようです。それでは、bashが他のキーをすべてのデフォルトバインディングとして受け入れるようにするにはどうすればよいですかMeta?Menu
答え1
Meta
キーボードキーから修飾子(たとえば、および)へのマッピングは、Control
GUIの下位レベルの部分であるXサーバーによって処理されます。このマッピングは前のスタイルで操作できます。xmodmap
コマンドまたは新しいスタイルXKBインターフェイスを使用するか、背面でGUI設定ツールのいずれかを使用します。
デフォルトでは、ほとんどの設定では、このMeta
キーはラベル付きのキーですAlt。その理由は、歴史的に多くのUNIXワークステーションにはというラベルの付いたキーがあり、MetaPCにはというラベルの付いたキーがあったためですAlt。したがって、バインディングがある場合は++をM-C-y
押します。CtrlAltY
現在のバインディングが何であるかを確認するには、xev
ターミナルでプログラムを実行してください。 xevウィンドウにフォーカスがある間にキーを押すと、端末に生成されたイベント履歴が表示されます。
端末エミュレータ(または物理端末に対応する端末装置)とアプリケーション間の通信は文字を使用します。を押すと、A端末は「key、nomodifier」というメッセージを受け取りますが、端末A
で実行されているアプリケーションに送信するのは文字ですa
。Upまたはなどのファンクションキーを押すと、対応するF1文字はありません。ターミナルは、エスケープ文字(バイト27、時には\e
またはで示される)で^[
始まる一連の文字を送信します。端末エミュレータ(like)Meta
の場合\ea
。MetaA
「ターミナル」、「シェル」、「tty」、「コンソール」の正確な違いは何ですか?便利な背景になることができます。
答え2
主なイベントはXサーバー(設定どおりxmodmap
)によって生成され、Xアプリケーションに送信されます。ウィンドウマネージャはxtermに送信する前にそれを傍受できます。その後、XTermはイベントをいくつかのバイトに変換し、そのバイトをシェルbashによって割り当てられた擬似ttyに送信します。
すべてのイベントがXTermによってバイトに直接変換されるわけではありません。たとえば、Ctrlキーshift自体はXキーボードイベントを生成しますが、XTermは何もないその中で実行されるシェル(または他のアプリケーション)に。これにはMetaキー自体も含まれますMenuが、秘密キーは含まれません。ただし、pressMeta生成イベントeにより、XTermはXTerm.VT100.metaSendsEscapeリソース設定に応じてバイト0xE5または2バイトシーケンス0x1B 0x65を送信します。
答え3
バッシュメタキーもともとは次のように定義されました(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.
まさにこう説明されています。呪いそしてxterm。 ㅏ珍しいこの機能を選択的にするために提供される端末(この側面は一般的ではありません。ほとんどの端末はハードコードされた動作を使用します(そしてあまり興味深いものではありません)。用語情報マニュアルページでは、次の端末機能について説明します。
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を設定するShiftキーとして機能する「メタキー」がある場合に表示されることがあります
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など)を提供します。
しかし、「慰安」は特別な場合だ。
metaXアプリケーションには慣例を除いてキーはありません。 Xにはメタキーやメタ修飾子が定義されていません。通常、端末はAlt-keyおよび/または既知の修飾子の1つを探します。xmodmap
、例えば、mod2
。後でxkbこの機能は鍵を見つけるために別の情報層を提供し、状況を複雑にします(ただし、この議論の改善は提供しません)Alt。
もちろん、習慣はあなたをこれまでに連れて行くことができます。なぜなら、あなたは具体的なものを知らないxmodmap
か知らないからです。xkb
円。たとえば、xtermは設定可能ですが、すべてのユーザーがそれを設定したいとは限りません。円同じ方法で。たとえば、リソースで使用されているAlt場合、予想されるメタキーではない可能性があります。translation
他のキーはメタキーですが、ユーザー(特にbashでエスケープシーケンスを使用しているユーザー)は、を押すとエスケープ文字を送信したい場合がありますAlt。ただし、次のように構成されていない限り、覚えておいてください。修飾子このようなことは起こりません。 xterm自体はイベントを結合しません。
xtermにはいくつかのリソース設定があります(文書化:マニュアルページ):
altIsNotMeta
そしてaltSendsEscape
(追加2007年)。eightBitInput
~から2006年メタパターンの元の意味に対応し、そのためのエスケープシーケンスを定義します。これはsmm
、rmm
(メタパターン設定/削除)端末機能を提供します。eightBitInput
で修正されました2003年元の入力バイトの代わりにデコードされたUnicode値を128シフトしてUTF-8を検討してください。metaSendsEscape
からの日付1999年eightBitInput
以前のmetaSendsEscape
。これは、次のいずれかを選択することによって達成されました。円escapeモード(8ビット追加)またはX11R4(1989)以降のキーの前に付けます。ただし、機能は起動時に決定されます。初期化中に入力が8ビットを許可するように設定されているか、7ビットのみが許可されるように設定されていることを確認するためのチェックが実行されます。それ以来変わりませんでした。
一部の人々はこの2つを同一視します(8号とエスケーププレフィックス)、後者を次のように参照してください。円モデル。問題をどのように見るかによって、eightBitInput
xtermのリソース設定は利用可能なメタキーを取得するソリューションの一部です。
追加資料: