注:ここでrestart-emacs
入手可能なパッケージに以下をラップしました。
以下は、純粋なelispを使用して目的を達成する別の方法です(実際にはシェルに依存しているためではありません)。秘Theは、現在のemacsが殺される直前に別のemacsプロセスを生成することです。
(defun launch-separate-emacs-in-terminal ()
(suspend-emacs "fg ; emacs -nw"))
(defun launch-separate-emacs-under-x ()
(call-process "sh" nil nil nil "-c" "emacs &"))
(defun restart-emacs ()
(interactive)
;; We need the new emacs to be spawned after all kill-emacs-hooks
;; have been processed and there is nothing interesting left
(let ((kill-emacs-hook (append kill-emacs-hook (list (if (display-graphic-p)
#'launch-separate-emacs-under-x
#'launch-separate-emacs-in-terminal)))))
(save-buffers-kill-emacs)))
emacsのGUIバージョンを開始するコードは簡単です。端末でemacsを起動するコードは少し注意が必要です。suspend-emacs
親プロセス(シェル)への端末入力として渡される文字列を渡すことができるという事実を使用します。ドキュメントから
(suspend-emacsおよびオプションのSTUFFSTRING)
Emacsを停止し、上位プロセスに戻ります。後で再開できます。「cannot-suspend」が非nilの場合、またはシステムがジョブ制御をサポートしていない場合は、代わりにサブシェルを実行します。
オプションの引数STUFFSTRINGが非nilの場合、その文字は一時停止後にEmacsの親によって端末入力として読み込まれるように詰められます。
そのため、基本的には、Emacsが強制終了される直前に一時停止し、現在一時停止中のemacs(すぐに終了する)を親シェルに伝えてから、別のemacsプロセスを起動します。これは、ターミナルemacsが実際にサスペンドできないがサブシェルを開始できるプラットフォーム(Windowsなど)では機能しないことに注意してください。