From c5837440d63d386db27f3cdf8718c9713e4bf80c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 22:36:39 -0500 Subject: [PATCH] Refactor kill-this-buffer advice And prevent it from switching to fallback buffer too early. Again. --- core/core-ui.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 66b437fbe..b47891fe5 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -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)))))