Subject: kill-buffer-quit-windows breaks kill-buffer-hook

From: Juri Linkov <[email-masked]>
Date: Thu, 30 Jan 2025 19:04:09 +0200

Please try to evaluate in the *scratch* buffer:

(progn
  (setopt kill-buffer-quit-windows t)
  (view-echo-area-messages)
  (pop-to-buffer-same-window (get-buffer-create "foo"))
  (add-hook 'kill-buffer-hook (lambda () (message "%S" (current-buffer))))
  (add-hook 'kill-buffer-hook (lambda () (kill-buffer (get-buffer "bar")))
	    nil t)
  (display-buffer (get-buffer-create "bar"))
  (switch-to-buffer (get-buffer "*scratch*"))
  (kill-buffer (get-buffer "foo")))

Then observe in the *Messages* buffer that the hook 'kill-buffer-hook'
is run in the *scratch* buffer that is never killed.

Afterwards try to set kill-buffer-quit-windows back to the default value nil,
and evaluate again.  Then everything is correct.

It seems that kill-buffer-quit-windows somehow messes up the current buffer
while running 'kill-buffer-hook'.

This is a distilled test case from the real problem
in treesit--explorer-kill-explorer-buffer
that prevents (add-hook 'kill-buffer-hook #'save-place-to-alist)
from saving places in the right buffer.