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


8

この質問は、emacsベータに関する私の以前の質問から生じました。つまりC-;、ターミナルでEmacs関数にバインドしたいのですが、Emacsに到達する前に何かがこのキーをキャプチャしているようです。Emacsはを押し;たと思っています。

明らかな疑いはターミナルエミュレーターですが、私はそれらの多く(xterm、gnome-terminal、ターミネーター、用語)をチェックしましたが、どれも動作しません。EmacsのGUIバージョンではキーがC-;正常に機能するため、ウィンドウマネージャーを除外できる可能性があります。また、bashとzshの2つの異なるシェルを試しましたが、やはり成功しませんでした。

他に何を試すことができますか?


Emacsでの質問によると、Ctrl +を押します。;Emacsに送信するので、何もキャプチャしていません。何が起こっているのかはCtrl +です。と裸; 同じ情報を送信します。それはどれですか:キャプチャ(つまり、Emacsは何も受信しません)、または情報の損失(つまり、Emacsは受信します;)?
Gilles「SO-邪悪なことをやめなさい」

C-;端末には標準コードはありません。C-v C-;プレーンbash と入力するとどうなりますか?
artm 2014年

私が見@Gilles ;emacs -nw私がヒットするかどうかにかかわらず;C-;
WeSenseASoulInSearchOfAnswers 2014年

@artm bashは、emacsの印刷とまったく同じ;です。
WeSenseASoulInSearchOfAnswers 2014年

回答:


11

おそらく、実際の端末を使用しなかったために混乱が生じた可能性があります。真面目なコンピューターが数台の直立した冷蔵庫のサイズだった頃、端末は文字と文字だけを使ってシリアルケーブルで中央のコンピューターと通信していました。文字は、ASCIIやEBCDICなどの一部の標準化された文字セットの一部でしたが、通常はASCIIです。ASCIIには33の制御文字があり、端末オペレーターは特殊なキー(DELなど)を押すか、CTRLキーを押しながら別のキーを押すことによってそれらを送信しました。中央コンピュータは、結果として生じる制御文字のみを確認しました。文字を生成するためにどのキーが押されたかはわかりませんでした。

xtermなどの端末エミュレーションプログラムは、その動作を模倣します。端末エミュレーターは33個のASCII制御文字をすべて送信する方法を提供し、Emacsはそれらの文字が送信された場合にそれらを受信します。しかし、Emacsは上記の説明の中央コンピューターのようなものです-端末エミュレーターの下で実行したときに実際に押されたキーを知る方法はありません。したがって、CTRLとセミコロンを押した場合、ターミナルエミュレーションプログラムがこれらのキープレスをASCII文字にマッピングしていない限り、Emacsは何かが入力されたことを認識しません。

端末エミュレータは通常、次のマッピングを使用して制御文字を生成します

ASCIIのキープレス
--------------------
エスケープ27
削除127
バックスペース8
Ctrl + Space 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を一部のウィンドウシステムでネイティブアプリケーションとして実行している場合、Emacsは文字だけでなく、キーストロークイベントへのフルアクセス権を持っています。したがって、EmacsはCTRLとセミコロンを一緒に押したことがわかり、そのキーストロークのペアにアクションを割り当てることができます。

端末には、制御キーを含む文字シーケンスを生成するファンクションキーと矢印キーが付いていることがよくあります。これらのシーケンスは通常、ASCIIコード27(ESCAPE)で始まります。


3

端末はキーではなく文字(より正確にはバイト)を送信します。Ctrl+のようなキーまたはキー;コードを押すと、この情報はバイトのシーケンスにエンコードされる必要があります。同様に、文字を表すKeychords AまたはShift+ AまたはÀ、その文字として送信されている:aAà(最後のものは、1つのまたは2つのバイトが端末の文字エンコーディングに依存しています)。

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

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

Ctrl+のバインディングを定義するには;、別のエスケープシーケンスを送信するようにターミナルエミュレータを構成する必要があります。私はあなたがGnome端末でこれを行うことができないと思います(Gnomeはめったに設定可能ではありません)Xtermでそれを行うことができます。参照してくださいすべてのキーの組み合わせを扱うことができるすべてのLinux端末はありますか?手順については。

ターミナルで実行できるシェルは含まれていません。GUI(X11)は単なる文字列としてではなく、キーと修飾子をエンコードする形式で入力イベントを送信するため、GUI Emacsは問題ありません。

キーボード入力とテキスト出力の仕組みを参照してくださいキーボードからアプリケーションへの入力の取得方法の詳細については、

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