Subject: Re: bug#68235: 29.1.90; Switching tabs stops following process output in selected window

From: martin rudalics <[email-masked]>
Date: Tue, 23 Jan 2024 10:30:49 +0100

> 1. 'post-set-window-configuration-functions' is called even
 > after 'delete-other-windows' and 'kill-buffer', albeit with
 > windows=nil, so no problems.

I don't understand what you mean here.  Do you mean that it gets called
because for some reason 'set-window-configuration' gets called after
'delete-other-windows' and 'kill-buffer'?

 > 2. It seems there is no way to get the name of the killed buffer
 > from '(nth 1 quad)'?

No way.  'buffer-name' with a killed buffer as argument has to return
nil - too many functions may rely on that.

 > Here is what I tried:
 >
 > (defun foo (frame windows)
 >    (while windows
 >      (let* ((quad (car windows))
 > 	   (window (car quad))
 > 	   (buffer (generate-new-buffer
 >                      (format " *Old buffer %s*" (nth 1 quad)))))
 >        (with-current-buffer buffer
 >          (insert (format "Restore the original buffer named %s:\n"
 > 			(nth 1 quad)))
 > 	(insert-button
 > 	 "[Restore]"
 >           'action
 > 	 (lambda (_button)
 >             (set-window-buffer window (find-file-noselect
 >                                        (buffer-file-name (nth 1 quad))))
 > 	   (set-window-point window (nth 3 quad))
 > 	   (set-window-start window (nth 2 quad) t)))
 > 	(set-window-buffer window buffer)))
 >      (setq windows (cdr windows))))
 >
 > It inserts to the transient buffer this text without the real buffer name:
 >
 >    Restore the original buffer named #<killed buffer>:
 >    [Restore]

I'd say Restore buffer from ... and use the file name here.

 > But the button really restores the original buffer.

Because many functions with a buffer as argument like 'buffer-file-name'
don't check whether that buffer is live.  You can find such functions by
looking for "decode_buffer (buffer)" in buffer.c.  'buffer-name' fails
because the name of the buffer _is_ reset to nil when the buffer is
killed.  We could add a new field to the buffer structure and a function
say 'buffer-last-name' which would return the last name a buffer had
before it was renamed: nil for a new buffer, the old name before the
last 'rename-buffer' and the last buffer name for a dead buffer.

And always think about what to propose when a new buffer with the same
name has been created meanwhile.

 > 3. It seems the buffer-local value of 'revert-buffer-function'
 >     is not preserved in the killed buffer?

'kill-buffer' calls reset_buffer_local_variables which scans the local
variables alist of the buffer and resets all values to their default
values.  Giving the variable either a 'permanent-local' property or
binding the default value to the buffer local value around 'kill-buffer'
could work around that but I'd rather try to save this (and other buffer
local values) in a separate alist for buffers stored in a configuration.

martin