[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#61102: 28.1; with-selected-window/save-window-excursion calls buffer
From: |
martin rudalics |
Subject: |
bug#61102: 28.1; with-selected-window/save-window-excursion calls buffer-list-update-hook only once |
Date: |
Thu, 2 Feb 2023 16:04:52 +0100 |
>> The following code:
>>
>> --8<---------------cut here---------------start------------->8---
>>
>> (let ((fn (lambda () (message "Buffer changed: %S" (current-buffer)))))
>> (add-hook 'buffer-list-update-hook fn)
>> (with-selected-window (minibuffer-window)
>> (save-window-excursion nil) nil)
>> (remove-hook 'buffer-list-update-hook fn)
>> nil)
>>
>> --8<---------------cut here---------------end--------------->8---
>>
>> Prints "Buffer changed: #<buffer *Minibuf-0*>" once, even though the
selection should return to the currently selected buffer (which is different from the mini-buffer).
>>
>> I would expect either that the hook 'buffer-list-update-hook is not called
at all, or that it is called twice (one time for every change of the selected buffer).
"for every change of the selected buffer" is ambiguous. I suppose the
OP means "for every change of the selected window" here.
> Martin, any comments on this? FWIW, I'm not sure this is a bug, but
> maybe I'm missing something.
The doc-string of 'with-selected-window' says that:
"It does not alter the buffer list ordering."
and the Elisp manual is more explicit by saying that
"The ordering of recently selected windows and the buffer list remain
unchanged unless you deliberately change them within FORMS; for
example, by calling ‘select-window’ with argument NORECORD ‘nil’.
Hence, this macro is the preferred way to temporarily work with
WINDOW as the selected window without needlessly running
‘buffer-list-update-hook’."
The one message the OP sees comes from this call in
'set-window-configuration'
select_window (data->current_window, Qnil, false);
'set-window-configuration' itself is called by 'save-window-excursion'.
martin