この問題は私のものから来ています。emacs betaに関する以前の質問。簡単に言えば、C-;
端末でEmacs機能にバインドしたいのですが、Emacsに到達する前に何かがこのキーをキャプチャしているようです。 Emacsは私がそれを押したと思います;
。
明らかな容疑者はターミナルエミュレータです。 EmacsのGUIバージョンでは、このキーはC-;
正しく機能するため、おそらくウィンドウマネージャを除外できます。また、bashとzshという2つの異なるシェルを試しましたが、再び成功しませんでした。
また何を試すことができますか?
答え1
おそらく実際の端末を使用していないので、混乱を招く可能性があります。深刻なコンピュータが数台の直立型冷蔵庫サイズであったとき、端末文字と文字のみを使用してシリアルケーブルを介して中央コンピュータと通信します。これらの文字はASCIIやEBCDICなどの標準化された文字セットの一部ですが、通常はASCIIです。 ASCIIには33個の制御文字があり、端末オペレータは特殊キー(例えば、DEL)を押すか、CTRLキーを押しながら別のキーを押して送信します。中央コンピュータは最後の制御文字だけを見ることができ、その文字を生成するためにどのキーが押されたかを知ることはできません。
xtermなどの端末エミュレーションプログラムはこの動作を模倣します。ターミナルエミュレータは33個のASCII制御文字をすべて送信する方法を提供し、送信されるとEmacsはそれを受け取ります。しかし、Emacsは上記の中央コンピュータと同じです。端末エミュレータで実行すると、実際にどのキーが押されたのかわかりません。したがって、CTRLとセミコロンを押すと、ターミナルエミュレータがそのキーをASCII文字にマップしない限り、Emacsは何も入力されていません。
ターミナルエミュレータは通常、次のマッピングを使用して制御文字†を生成します。
キーASCII ------ 脱出27 127 削除 バックスペースキー8 CTRL+スペースバー 0 CTRL+@0 Ctrl+A 1 Ctrl+B 2 Ctrl+C 3 など... CTRL+X 24 CTRL+Y 25 Ctrl+Z 26 CTRL+[ 27 CTRL+\ 28 CTRL+] 29 CTRL+^30 CTRL+_ 31
Ctrl+はリストに表示されません。端末は通常、次に割り当てられた印刷可能文字のみを送信します。鍵CTRL+の場合鍵制御文字にマップされていません。もしそうなら、端末エミュレータは何を送るべきかを教えてくれます。唯一の問題は、Ctrl +を押すときに何をすべきかわからないということです。
これらはすべて端末または端末エミュレーションプログラムを使用している場合にのみ適用されます。 EmacsをWindowsシステム上のネイティブアプリケーションとして実行する場合、Emacsは文字だけでなくキーストロークイベントへのフルアクセス権を持ちます。したがって、EmacsはユーザーがCTRLとセミコロンを同時に押したことを知り、そのキーペアにタスクを割り当てることができます。
†端末には、通常、制御文字を含む文字シーケンスを生成するファンクションキーと矢印キーがあります。これらのシーケンスは通常ASCIIコード27(ESCAPE)で始まります。
答え2
端末はキー以外の文字(より正確にはバイト)を送信します。特定のキーやCtrl+などのキーコードを押すと、;その情報を一連のバイトにエンコードする必要があります。Aまたは、Shift+Aまたはなどの文字を表すキーコードは、次の文字で送信さÀれます。a
A
à
ファンクションキーに関連するキー入力には対応する文字がないため、エスケープシーケンスに送信されます。エスケープ文字で始まるバイトシーケンス(\e
Emacs文字列では、^[
バッファにそのまま入力するとターコイズで表示されます)。一部のファンクションキーには対応するバイトがあります。制御文字。
キーとキーCtrl+の標準エスケープシーケンスがないため、;ほとんどの端末エミュレータは代わりに文字を生成します;
。これにより、Ctrl押されている修飾子に関する情報が失われます。
Ctrl+のバインディングを定義するには、;別のエスケープシーケンスを送信するように端末エミュレータを設定する必要があります。 Gnome Terminalではこれを行うことはできないようです(Gnomeはほとんど設定できません)。 Xtermを使用してこれを行うことができます。バラよりすべてのキーの組み合わせを処理できるLinux端末はありますか?指示のために。
端末で実行されているシェルは含まれません。 GUI Emacsは、GUI(X11)が文字シーケンスではなくエンコードキーと修飾子の形で入力イベントを送信するため、問題はありません。
バラよりキーボード入力とテキスト出力はどのように機能しますか?入力がキーボードからアプリケーションに送信される方法の詳細な背景情報。