テキスト端末では、Emacsをサスペンドすることが可能です。これは、Emacsを一時的に停止し、制御を上位プロセス(通常はシェル)に戻すことを意味します。これにより、同じEmacsプロセス内で、同じバッファ、同じキルリング、同じアンドゥ履歴などを保持したまま、後で編集を再開できます。Emacsを再開するには、親シェルで適切なコマンド(おそらく
fg)を使用してください。
サスペンドは、Emacsセッションを開始した端末デバイス上でのみ可能です。このデバイスを、セッションの制御端末と呼びます。制御端末がグラフィカル端末である場合、サスペンドは許可されません。グラフィカル環境では、Emacsに特別な操作を加えることなく単に別のアプリケーションに切り替えられるため、通常サスペンドは関係ありません。
一部のオペレーティングシステム(SIGTSTP を持たないものや
MS-DOS)では、ジョブの中断をサポートしていません。こうしたシステムでは、中断を行うと、実際には Emacs
のサブプロセスとして一時的に新しいシェルが生成されます。その後、そのシェルを終了することで Emacs に戻ることになります。
この関数はEmacsを停止し、制御を上位プロセスに戻します。上位プロセスがEmacsを再開すると、suspend-emacsはLispの呼び出し元にnilを返します。
この関数はEmacsセッションの制御端末でのみ動作します。他のttyデバイスの制御権を解放するには、suspend-ttyを使用してください(後述)。Emacsセッションで複数の端末を使用している場合は、Emacsをサスペンドする前に、他のすべての端末のフレームを削除する必要があります。そうしないと、この関数はエラーを返します。複数の端末を参照してください。
string が nil でない場合、その文字は
Emacs の上位シェルに送られ、ターミナル入力として読み込まれます。ただし、Emacs
がターミナル上で対話的に動作していない場合や、ターミナル入力への文字の投入に特別な権限が必要な場合、あるいはこのプラットフォームでサポートされていない場合は、この処理はスキップされます。
サスペンド前には、suspend-emacs が通常のフック suspend-hook を実行します。ユーザーが Emacs を再開した後は、suspend-emacs が通常のフック suspend-resume-hook を実行します。フック を参照してください。
再開後の次の再表示では、変数 no-redraw-on-reenter が nil でない限り、画面全体が再描画されます。画面の更新を参照してください。
これらのフックの使用例を以下に示します。
(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)を評価すると、以下のように表示されます。
---------- Buffer: Minibuffer ---------- Really suspend? y ---------- Buffer: Minibuffer ----------
---------- Parent Shell ---------- bash$ fg
---------- Echo Area ---------- Resumed!
なお、一部のオペレーティングシステムでは、Emacsの親シェルに string を送信する際に特別な権限が必要となる場合があり、その場合、シェルへの実行指示として string がサイレントに失敗することがあります。他のシステムではこれはサポートされておらず、実行を試みるとEmacsがエラーを通知します。また、string はシェルによって実行されたとしても、エコーされない場合があります。したがって、移植性の高いLispプログラムにおいて、この機能に依存することは推奨しません。
この変数は、Emacsがサスペンドする前に実行する通常のフックです。
この変数は、サスペンドからの復帰時にEmacsが実行する通常のフックです。
tty が Emacs
で使用する端末デバイスを指定している場合、この関数はそのデバイスを解放し、元の状態に戻します。そのデバイスを使用していたフレームは引き続き存在しますが、更新は行われず、Emacs
はそれらから入力を読み取りません。tty
には、端末オブジェクト、フレーム(そのフレームの端末を意味します)、または nil(選択中のフレームの端末を意味します)を指定できます。複数の端末 を参照してください。
tty が既にサスペンドされている場合、この関数は何も行いません。
この関数はフック suspend-tty-functions
を実行し、各関数にターミナルオブジェクトを引数として渡します。
この関数は、以前にサスペンドされた端末デバイス tty を再開します。ここで tty は、suspend-tty と同様の値を取り得ます。
この関数は、ターミナルデバイスを再度開き、再初期化した上で、そのターミナルで選択されているフレームで再描画します。その後、フック resume-tty-functions を実行し、各関数にターミナルオブジェクトを引数として渡します。
同じデバイスが既に別のEmacsターミナルで使用されている場合、この関数はエラーを通知します。ttyがサスペンドされていない場合、この関数は何もしません。
この関数は、tty が Emacs セッションの制御端末である場合に non-nil を返します。tty
には端末オブジェクト、フレーム(そのフレームの端末を意味します)、または nil(選択中のフレームの端末を意味します)を指定できます。