gnuservを自動で再起動させる方法

俺はEmacs23になってもいまだにgnuserv/gnuclientを使っている。しかし、なにかのひょうしでgnuservが落ちて「Gnuserv process exited; restart with `M-x gnuserv-start'」と出てきてしまい、落ちたままになっている。そうなると、gnuclientが動かなくなり、とても困ってしまう。
メッセージを表示している関数がgnuserv-sentinelだと判明し、読んでみたところ、「以前は落ちたら自動的に再起動していたが、下手すると無限ループする可能性がある」と書いてあった。
かといって、落ちたまま放置しているといろいろ困るので、せめて「gnuservが落ちているなら立ち上げる」関数を1分毎に動かすことにした。

(defun gnuserv-start-maybe ()
  (interactive)
  (or gnuserv-process (gnuserv-start)))
(run-with-timer 0 60 'gnuserv-start-maybe)

gnuserv/gnuclientとemacsserver/emacsclientの違い

俺は昔からgnuserv/gnuclientを使ってきたが、Emacs23になったら、multi-ttyもあることだし乗り換えようと思っていた。しかし…カレントバッファが常にサーバのバッファで実行されるため、「現在の」カレントバッファを取得してくれない。
Emacs23だとmulti-ttyがあるから仕方ないのかな。

$ emacsclient -e '(current-buffer)' -n 
#<buffer  *server*>
$ gnudoit '(current-buffer)'
2009-09-29.txt

さらに、出力の表記も微妙に異なる。

$ emacsclient -e '"a"' -n         
"a"
$ gnudoit '"a"'                   
a

なお、gnudoitは「gnuclient -batch -eval」の略だと考えてよい。実際はシェルスクリプトである。