「はい」は 1 回で充分です
 2006.10.12

状況に応じて質問があったりなかったりする対話型インタフェースは苦手です。

save-buffers-kill-emacs (C-x C-c) は、 buffer-modified-p なバッファ毎にいちいち y-or-n-p してくれます。 それでも buffer-modified-p なバッファがあると yes-or-no-p してくれます。 のみならず、終了に質問が必要なプロセスがあると yes-or-no-p してくれます。

ぃゃ。 教えてくれるのはありがたいのですが、プロンプトの回数が変ることで安全性が確保できるものでしょうか。 ちょっと信じられません。 yes-or-no-p が来るつもりで y-or-n-p が来たら、とっても危険。 破棄するつもりのバッファを保存してしまう悲劇。 いつも shell-mode 等を動かしてて yes する癖がついてる人はちうい。 yes-or-no-p が改行必要なのに対し、y-or-n-p はどちらかの文字を入れたら反応しちまう罠。

バッファは自ら save-buffer (C-x C-s) なり kill-buffer (C-x k) するべきでしょう。 引数つきの list-buffers (C-u C-x C-b) から、dired 風に s や d でマークして x というのもよいでしょう。

save-buffers-kill-emacs があんまり過保護なので、プロンプトの回数が固定な物と差し替えてます。 so-long.el

(autoload 'so-long "so-long" nil t)
(defadvice save-buffers-kill-emacs
  (around so-long () activate)
  (so-long))

編集中のバッファや実行中のプロセスがあろうがなかろうが 1 回だけ yes-or-no-p します。 yes したら必ず落ちるけど、しないかぎりは落ちないぞ、と。 プロンプトにバッファやプロセスがあるかないかの情報はでるので、疑問に思ったら no なり keyboard-quit (C-g) で中止し list-buffers で確認します。

defadvice しているのは、substitute-key-definition で入れ替えると defadvice された分が無効になるので。

カテゴリー:技術情報メモ