2008年11月30日日曜日

xyzzy を再起動させる

新しいネタを提供する気力がないので手元にある既存のものを。

(defun reboot-xyzzy (&optional cleanup)
  "xyzzyを再起動する."
  (interactive "P")
  ;; ついでに初期化する
  (when cleanup
    (delete-file (si:dump-image-path) :if-does-not-exist :skip)
    (let ((siteinit (find-load-path "siteinit")))
      (and siteinit
           (string-match "\\.lc$" siteinit)
           (delete-file siteinit))))
  (cond ((modified-buffer-exist-p)
         (error "保存をしよう、な!"))
        ((running-process-exist-p)
         (error "サブプロセスが走ってるで")))
  (and (call-process (merge-pathnames "xyzzy.exe" (si:system-root))
                     ;; 環境変数の設定
                     :environ `(("XYZZYHOME" . ,(si:system-root))
                                ;; 設定ファイル (xyzzy.ini等) のディレクトリ
                                ("XYZZYCONFIGPATH" . ,(user-config-path)))
                     :no-std-handles t
                     :exec-directory (si:system-root)
                     :show t
                     :wait nil)
       (kill-xyzzy)))

(defun modified-buffer-exist-p ()
  "保存する必要のあるバッファがあるか."
  (remove-if-not #'need-buffer-save-p (buffer-list)))

(defun running-process-exist-p ()
  "動作中のプロセスがあるか."
  (some #'(lambda (pid)
            (eq (process-status pid) :run))
        (process-list)))

使い方:

  • 再起動させる M-x: reboot-xyzzy

  • 再起動のついでに、ダンプファイルと siteinit.lc を削除して再ダンプさせるようにする。 C-u M-x: reboot-xyzzy

注意:

保存していないバッファがあったりサブプロセスが走っていたりすると、「いいの?」って質問されて止まっちゃうのでそこはエラーにしてます。保存関係は (save-some-buffers) 使ってもいいかも。

あと、自分は xyzzy.ini ファイルを $XYZZY/usr/ ディレクトリ直下に置いてあるで、普通に使ってる人は ("XYZZYCONFIGPATH" . ,(user-config-path)) の部分を削除して下さい。

紙一重で動いてるスクリプトな気がするのでご使用は各自の責任でお願いします。

0 件のコメント:

コメントを投稿