他の回答とコメントに基づいて、変更されたバッファとアクセスしているファイルを比較するオプションを提供するカスタムのkillコマンドを次に示します。私はこれをマッピングしましC-x C-k
たがkill-buffer
、@ Drewの回答で提案されているように再マッピングすることもできます。
(defun my/kill-this-buffer ()
(interactive)
(catch 'quit
(save-window-excursion
(let (done)
(when (and buffer-file-name (buffer-modified-p))
(while (not done)
(let ((response (read-char-choice
(format "Save file %s? (y, n, d, q) " (buffer-file-name))
'(?y ?n ?d ?q))))
(setq done (cond
((eq response ?q) (throw 'quit nil))
((eq response ?y) (save-buffer) t)
((eq response ?n) (set-buffer-modified-p nil) t)
((eq response ?d) (diff-buffer-with-file) nil))))))
(kill-buffer (current-buffer))))))
同じ基本的な実装を使用して、アドバイスすることもできますkill-buffer
。このアプローチでkill-buffer
は、たとえば、Ibufferからマークされたバッファーを削除するときに、呼び出された場所のどこにでも差分を表示するオプションが表示されます。
(defun my/kill-buffer (orig-func &optional buffer-or-name)
(catch 'quit
(save-window-excursion
(with-current-buffer buffer-or-name
(let (done (buf (current-buffer)))
(when (and buffer-file-name (buffer-modified-p))
(while (not done)
(let ((response (read-char-choice
(format "Save file %s? (y, n, d, q) " (buffer-file-name buf))
'(?y ?n ?d ?q))))
(setq done (cond
((eq response ?q) (throw 'quit nil))
((eq response ?y) (save-buffer) t)
((eq response ?n) (set-buffer-modified-p nil) t)
((eq response ?d) (diff-buffer-with-file) nil))))))
(apply orig-func (list (current-buffer))))))))
(advice-add 'kill-buffer :around #'my/kill-buffer)
defadvice
。これにより、組み込みを簡単に拡張できますkill-buffer
。