Emacsサーバを適切に終了する

emacs --daemon

でサーバを起動しておいて, 複数のターミナルウィンドウから

emacsclient -nw

することで, ターミナルモードでも単一のEmacsプロセスで複数フレームの編集ができる. これはとてもべんり. でもごく稀にサーバを再起動したいことがあって, killすればよいかと思ったら, ターミナルが崩れて悲惨なことになってしまった.

emacsclient -e '(kill-emacs)'

とすれば正常にサーバプロセスを停止できるけれど, これだといちいち

The current server still has clients; delete them? (yes or no)

と訊かれてしまう. 調べてみるとserver-kill-emacs-query-functionが呼ばれているせいらしいので, これをkill-emacs-query-functionsからremove-hookしてみたけれど, うまくいかない. 途方に暮れていると, Emacsのサーバ機能を実装している server.el のソースコードがこんなふうになっているのを見つけた:

...
;;;###autoload
(defun server-start (&optional leave-dead)
...
  (interactive "P")
  (when (or (not server-clients)
        ;; Ask the user before deleting existing clients---except
        ;; when we can't get user input, which may happen when
        ;; doing emacsclient --eval "(kill-emacs)" in daemon mode.
        (if (and (daemonp)
                 (null (cdr (frame-list)))
                 (eq (selected-frame) terminal-frame))
            leave-dead
          (yes-or-no-p
           "The current server still has clients; delete them? ")))
...
emacs.git - Git mirror of Emacs CVS repo

ハードコードされとる!

仕方ないので,

emacsclient -e '(progn (defun yes-or-no-p (p) t) (kill-emacs))'

とすることにした. ただし, 保存されていないバッファがあった場合のメッセージもおそらく表示されないので注意.