次: , 前: Special Keysyms, 上: System Interface


37.11 フロー制御

本節では、 『Emacsがなぜコマンド文字集合の中からフロー制御文字を使うのか?』という 質問に答えたいと思います。 この話題に関する別の視点については、 配布に含まれるファイルemacs/INSTALLの中の フロー制御に関する記述を読んでください。 termcapの定義とDECの端末集線器については、 emacs/etc/TERMSを参照してください。

ある時期には、ほとんどの端末ではフロー制御を行っておらず、 C-sC-qをフロー制御に用いるものもありませんでした。 したがって、コマンド文字としてC-sC-qを選ぶことは 自然であり議論の余地はありませんでした。 キーに割り付けるべきコマンドがたくさんあったので、 ほとんどすべてのASCIIコントロール文字に意味を与えました。

のちに、フロー制御にこれらの文字を必要とする端末が導入されたのです。 それらはフルスクリーンエディタ向きの端末ではなかったので、 Emacsの保守陣はそれらを無視しました。 後年、C-sC-qによるフロー制御が 端末で広く使われるようになりましたが、当時はそれはオプションでした。 Emacsユーザーの多くはフロー制御をオフにして、 フロー制御のために無意味なキーバインディングに 替えようとはしなかったのです。

Emacsと端末や集線器の製造業者のどちらの使い方が『正しい』でしょう? この問に簡単な答えはありません。

C-sC-qで引き起こされる問題を解消するのに 気が進まないのは、C-sC-qであることに理由がないからです。 文字ストリームに透過な別の(実用上一般的ではないが) フロー制御技術があります。 さらに、それらをフロー制御に使うのは正式な規格ではありません。 興味深いことですが、(1970年ころの)紙テープパンチャ付きの テレタイプモデル33では、計算機からパンチャをオン/オフするために C-sC-qを送っていました!

ウィンドウシステムやPC端末エミュレータが文字端末を置き換えるようになり フロー制御の問題は徐々に解消しつつあります。 しばらくは、読者が望むならEmacsはフロー制御を オンにする手軽な方法を提供します。 関数enable-flow-controlを呼び出すのです。

— コマンド: enable-flow-control

この関数は、出力のフロー制御にC-sC-qを 使うようにするとともに、keyboard-translate-table (see Translating Input)を用いて C-\C-^をそれらのかわりに使えるようにする。

読者のファイル.emacsで関数enable-flow-control-onを使えば、 特定の種類の端末で自動的にフロー制御をオンにできます。

— 機能: enable-flow-control-on &rest termtypes

この関数は、端末の種類がtermtypesの1つであると、 フロー制御をオンにしC-\C-^をかわりに使う。 たとえば、つぎのように使う。

          (enable-flow-control-on "vt200" "vt300" "vt101" "vt131")
     

enable-flow-controlが行う処理はつぎのとおりです。

  1. (set-input-mode nil t)で 端末入力をcbreakモードに設定し、 オペレーティングシステムにフロー制御を行うように指示する。
  2. C-\C-^C-sC-qに変換するように keyboard-translate-tableを設定する。 非常に下位レベルであることを除けば、 EmacsはC-sC-qを打ったと考えるので、 たとえ他のコマンドに対してもC-\C-^を打ったとしても 実質的にはC-sC-qを打ったことになる。 see Translating Input

端末側がフロー制御文字を発行するのであれば、 カーネルのフロー制御処理をオンにすれば、 その端末に対する普通のパディングより少なくしても動作するはずです。 termcapの定義をカスタマイズしてパディング量を減らします。 あるいは、baud-rateに小さめの値を設定すると、 パディングの必要量の計算にEmacsは低い速度を使います。 See Terminal Output