Я использую следующий фрагмент кода - в отличие от решения Noufal игнорировать измененный буфер или нет, он сохранит буфер, а затем уничтожит его.Он также удаляет окно, которое имеет значение, когда у вас отображается несколько подокнов - по умолчанию оно удаляет окно вместо переключения на какой-либо другой буфер.(Чтобы использовать это удобно, вам, конечно, нужно привязать к нему какой-нибудь ключ.)
;; Kill the current buffer immediatly, saving it if needed.
(defvar kill-save-buffer-delete-windows t
"*Delete windows when `kill-save-buffer' is used.
If this is non-nil, then `kill-save-buffer' will also delete the corresponding
windows. This is inverted by `kill-save-buffer' when called with a prefix.")
(defun kill-save-buffer (arg)
"Save the current buffer (if needed) and then kill it.
Also, delete its windows according to `kill-save-buffer-delete-windows'.
A prefix argument ARG reverses this behavior."
(interactive "P")
(let ((del kill-save-buffer-delete-windows))
(when arg (setq del (not del)))
(when (and (buffer-file-name) (not (file-directory-p (buffer-file-name))))
(save-buffer))
(let ((buf (current-buffer)))
(when del (delete-windows-on buf))
(kill-buffer buf))))