GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Suspending-Emacs.html ・ emacs-doc.conao3.com

43.2.2 Emacsの一時停止

テキスト端末では、Emacsをサスペンドすることが可能です。これは、Emacsを一時的に停止し、制御を上位プロセス(通常はシェル)に戻すことを意味します。これにより、同じEmacsプロセス内で、同じバッファ、同じキルリング、同じアンドゥ履歴などを保持したまま、後で編集を再開できます。Emacsを再開するには、親シェルで適切なコマンド(おそらく fg)を使用してください。

サスペンドは、Emacsセッションを開始した端末デバイス上でのみ可能です。このデバイスを、セッションの制御端末と呼びます。制御端末がグラフィカル端末である場合、サスペンドは許可されません。グラフィカル環境では、Emacsに特別な操作を加えることなく単に別のアプリケーションに切り替えられるため、通常サスペンドは関係ありません。

一部のオペレーティングシステム(SIGTSTP を持たないものや MS-DOS)では、ジョブの中断をサポートしていません。こうしたシステムでは、中断を行うと、実際には Emacs のサブプロセスとして一時的に新しいシェルが生成されます。その後、そのシェルを終了することで Emacs に戻ることになります。

コマンド: suspend-emacs &optional string

この関数は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プログラムにおいて、この機能に依存することは推奨しません。

変数: suspend-hook

この変数は、Emacsがサスペンドする前に実行する通常のフックです。

変数: suspend-resume-hook

この変数は、サスペンドからの復帰時にEmacsが実行する通常のフックです。

関数: suspend-tty &optional tty

tty が Emacs で使用する端末デバイスを指定している場合、この関数はそのデバイスを解放し、元の状態に戻します。そのデバイスを使用していたフレームは引き続き存在しますが、更新は行われず、Emacs はそれらから入力を読み取りません。tty には、端末オブジェクト、フレーム(そのフレームの端末を意味します)、または nil(選択中のフレームの端末を意味します)を指定できます。複数の端末 を参照してください。

tty が既にサスペンドされている場合、この関数は何も行いません。

この関数はフック suspend-tty-functions を実行し、各関数にターミナルオブジェクトを引数として渡します。

関数: resume-tty &optional tty

この関数は、以前にサスペンドされた端末デバイス tty を再開します。ここで tty は、suspend-tty と同様の値を取り得ます。

この関数は、ターミナルデバイスを再度開き、再初期化した上で、そのターミナルで選択されているフレームで再描画します。その後、フック resume-tty-functions を実行し、各関数にターミナルオブジェクトを引数として渡します。

同じデバイスが既に別のEmacsターミナルで使用されている場合、この関数はエラーを通知します。ttyがサスペンドされていない場合、この関数は何もしません。

関数: controlling-tty-p &optional tty

この関数は、tty が Emacs セッションの制御端末である場合に non-nil を返します。tty には端末オブジェクト、フレーム(そのフレームの端末を意味します)、または nil(選択中のフレームの端末を意味します)を指定できます。

コマンド: suspend-frame

このコマンドはフレームをサスペンドします。GUIフレームの場合はiconify-frameを呼び出します(フレームの可視性を参照)。テキスト端末上のフレームの場合は、そのフレームが制御端末デバイスに表示されているか否かに応じて、suspend-emacsまたはsuspend-ttyのいずれかを呼び出します。