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 のソースコードがこんなふうになっているのを見つけた:
...
(defun server-start (&optional leave-dead)
...
(interactive "P")
(when (or (not server-clients)
(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))'
とすることにした. ただし, 保存されていないバッファがあった場合のメッセージもおそらく表示されないので注意.