Previous: , Up: Getting Out   [Contents][Index]


38.2.2 Emacsのサスペンド

テキスト端末ではEmacsのサスペンドができます。これはEmacsを一時的にストップして上位のプロセスに制御を返します。これは通常はshellです。これにより後で同じEmacsプロセス内の同じバッファー、同じkillリング、同じアンドゥヒストリー、...で編集を再開できます。Emacsを再開するには親shell内で適切なコマンド — 恐らくはfg — を使用します。

そのEmacsセッションが開始された端末デバイス上でのみサスペンドは機能します。そのデバイスのことをセッションの制御端末(controlling terminal)と呼びます。制御端末がグラフィカルな端末ならサスペンドは許されません。グラフィカルな端末ではEmacsで特別なことをせずに単に別のアプリケーションにスイッチできるのでサスペンドは通常は関係ありません。

いくつかのオペレーティングシステム(SIGTSTPのないシステムやMS-DOS)では、ジョブの停止はサポートされません。これらのシステムでの“停止”は、Emacsのサブプロセスとして新たなshellを一時的に作成します。Emacsに戻るためには、そのshellをexitすればよいでしょう。

Command: suspend-emacs &optional string

この関数はEmacsを停止して上位のプロセスに制御を返す。上位プロセスがEmacsを再開する際には、Lispでのsuspend-emacsの呼び出し元にnilをリターンする。

この関数はそのEmacsセッションの制御端末上でのみ機能する。他のTTYデバイスの制御を放棄するにはsuspend-ttyを使用する(下記参照)。そのEmacsセッションが複数の端末を使用する場合にはEmacsのサスペンド前に他のすべての端末からフレームを削除しなければならず、さもないとこの関数はエラーをシグナルする。Multiple Terminalsを参照のこと。

stringが非nilなら、その各文字はEmacsの上位shellに端末入力として送信される。string内の文字は上位shellによりエコーされずに結果だけが表示される。

サスペンドする前にsuspend-emacsはノーマルフックsuspend-hookを実行する。ユーザーがEmacs再開後にsuspend-emacsはノーマルフックsuspend-resume-hookを実行する。Hooksを参照のこと。

再開後の次回再表示では変数no-redraw-on-reenternilならスクリーン全体が再描画される。Refresh Screenを参照のこと。

以下はこれらのフックの使用例:

(add-hook 'suspend-hook
          (lambda () (or (y-or-n-p "Really suspend? ")
                         (error "Suspend canceled"))))
(add-hook 'suspend-resume-hook (lambda () (message "Resumed!")
                                 (sit-for 2)))

(suspend-emacs "pwd")を評価すると以下を目にするだろう:

---------- Buffer: Minibuffer ----------
Really suspend? y
---------- Buffer: Minibuffer ----------

---------- Parent Shell ----------
bash$ /home/username
bash$ fg

---------- Echo Area ----------
Resumed!

Emacsサスペンド後に‘pwd’がエコーされないことに注意。エコーはされないがshellにより読み取られて実行されている。

Variable: suspend-hook

この変数はEmacsがサスペンド前に実行するノーマルフック。

Variable: suspend-resume-hook

この変数はサスペンド後の再開時にEmacsが実行するノーマルフック。

Function: suspend-tty &optional tty

ttyにEmacsが使用する端末デバイスを指定すると、この関数はそのデバイスを放棄して以前の状態にリストアする。そのデバイスを使用していたフレームは存在を続けるが更新はされず、Emacsはそれらのフレームから入力を読み取らない。ttyには端末オブジェクト、フレーム(そのフレームの端末の意)、nil (選択されたフレームの端末の意)を指定できる。Multiple Terminalsを参照のこと。

ttyがサスペンド済みなら何も行わない。

この関数は端末オブジェクトを各関数への引数としてフックsuspend-tty-functionsを実行する。

Function: resume-tty &optional tty

この関数は以前にサスペンドされたデバイスttyを再開する。ここでttysuspend-ttyに指定できる値と同じである。

この関数は端末デバイスの再オープンと再初期化を行い、その端末の選択されたフレームで端末を再描画する。それから端末ブジェクトを各関数への引数としてフックresume-tty-functionsを実行する。

同じデバイスが別のEmacs端末で使用済みなら、この関数はエラーをシグナルする。ttyがサスペンドされていなければ何もしない。

Function: controlling-tty-p &optional tty

この関数はttyがそのEmacsセッションの制御端末なら非nilをリターンする。ttyには端末オブジェクト、フレーム(そのフレームの端末の意)、nil (選択されたフレームの端末の意)を指定できる。

Command: suspend-frame

このコマンドはフレームをサスペンドする。GUIフレームではiconify-frameを呼び出す(Visibility of Framesを参照)。テキスト端末上のフレームでは、そのフレームが制御端末デバイス上で表示されていればsuspend-emacs、されていなければsuspend-ttyのいずれかを呼び出す。