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