端末で実行されているEmacsがCtrl +を「;」と区別できないのはなぜですか?

端末で実行されているEmacsがCtrl +を「;」と区別できないのはなぜですか?

この問題は私のものから来ています。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またはなどの文字を表すキーコードは、次の文字で送信さÀれます。aAà

ファンクションキーに関連するキー入力には対応する文字がないため、エスケープシーケンスに送信されます。エスケープ文字で始まるバイトシーケンス(\eEmacs文字列では、^[バッファにそのまま入力するとターコイズで表示されます)。一部のファンクションキーには対応するバイトがあります。制御文字

キーとキーCtrl+の標準エスケープシーケンスがないため、;ほとんどの端末エミュレータは代わりに文字を生成します;。これにより、Ctrl押されている修飾子に関する情報が失われます。

Ctrl+のバインディングを定義するには、;別のエスケープシーケンスを送信するように端末エミュレータを設定する必要があります。 Gnome Terminalではこれを行うことはできないようです(Gnomeはほとんど設定できません)。 Xtermを使用してこれを行うことができます。バラよりすべてのキーの組み合わせを処理できるLinux端末はありますか?指示のために。

端末で実行されているシェルは含まれません。 GUI Emacsは、GUI(X11)が文字シーケンスではなくエンコードキーと修飾子の形で入力イベントを送信するため、問題はありません。

バラよりキーボード入力とテキスト出力はどのように機能しますか?入力がキーボードからアプリケーションに送信される方法の詳細な背景情報。

関連情報