Refactor kill-this-buffer advice

And prevent it from switching to fallback buffer too early. Again.
This commit is contained in:
Henrik Lissner 2018-02-03 22:36:39 -05:00
parent ee24aba034
commit c5837440d6
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -545,19 +545,24 @@ instead)."
(defun doom*switch-to-fallback-buffer-maybe (orig-fn)
"Advice for `kill-this-buffer'. If in a dedicated window, delete it. If there
are no real buffers left, switch to `doom-fallback-buffer'. Otherwise, delegate
to original `kill-this-buffer'."
are no real buffers left OR if all remaining buffers are visible in other
windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
`kill-this-buffer'."
(let ((buf (current-buffer)))
(cond ((window-dedicated-p)
(delete-window))
((eq buf (doom-fallback-buffer))
(message "Can't kill the fallback buffer."))
((doom-real-buffer-p buf)
(or (kill-buffer buf)
(previous-buffer))
;; if there are no (real) buffers left to switch to, land on the
;; fallback buffer.
(unless (cl-set-difference (doom-real-buffer-list)
(doom-visible-buffers))
(switch-to-buffer (doom-fallback-buffer))))
(when (or ;; if there aren't more real buffers than visible buffers,
;; then there are no real, non-visible buffers left.
(not (cl-set-difference (doom-real-buffer-list)
(doom-visible-buffers)))
;; if we end up back where we start (or previous-buffer
;; returns nil), we have nowhere left to go
(memq (previous-buffer) (list buf 'nil)))
(switch-to-buffer (doom-fallback-buffer)))
(kill-buffer buf))
(t
(funcall orig-fn)))))