From: martin rudalics <rudalics@gmx.at>
To: Drew Adams <drew.adams@oracle.com>
Cc: 4748@emacsbugs.donarmstrong.com
Subject: bug#4748: 23.1; least recently used window - is it?
Date: Mon, 19 Oct 2009 09:36:07 +0200 [thread overview]
Message-ID: <4ADC16E7.9010406@gmx.at> (raw)
In-Reply-To: <EF566FD002A94FAFADA5A88747562FAD@us.oracle.com>
>> (let ((owin (selected-window)))
>> (dolist (window (window-list))
>> (unless (eq window owin)
>> (select-window window)))
>> (get-lru-window))
>
> That doesn't work either. For the same reason: `get-lru-window' will never
> return certain windows.
But it correctly sets the LRU window internally without looping.
>> ((or (window-minibuffer-p) (eq (window-dedicated-p) t))
>> (pop-to-buffer buffer-or-name nil norecord))
>
> (I'm curious: Why not call `pop-to-buffer' if the window is dedicated or a
> minibuffer? What's the reason for that conditional?)
Why "Why not" ... ?
> If you feel that your version of `switch-to-buffer' makes it respect the
> use-other-frame variables but otherwise have the same behavior as the current
> `switch-to-buffer', then why don't you install it?
>
> But do you in fact claim that? If not, I don't see it as a solution to the
> question.
My version tried to be faithful to the one written in C.
>> > `switch-to-buffer', which Stefan says repeatedly (and it
>> > sounds right to me) should not be used in Lisp code (i.e.
>> > should be used pretty much only interactively), does not
>> > respect `special-display-regexps',
>> > `special-display-buffer-names', or `pop-up-frames'.
>>
>> Because it wouldn't make much sense to respect these ;-)
>
> Huh? Why not? Why shouldn't it use the current window (as now) except when those
> variables say not to (a la `switch-to-buffer-other-window' and `pop-to-buffer')?
Presently a `not-this-window' argument to `display-buffer' overrides
these variables. Any `same-window' argument would override them too.
> IOW, have it do just what you claim it already does for dedicated windows. Just
> as a dedicated window says "don't use me", so the use-other-frame variables also
> say "don't use me". You say that we listen to the former - but we unfortunately
> still do not listen to the latter.
The idea of `switch-to-buffer' is to switch to a buffer in the selected
window. This won't change ever. The only thing we can (and probably
should) change is whether an application like bookmarks does call
`switch-to-buffer' in the first place.
>> We'd have to look at each of these cases to tell whether they can use
>> `pop-to-buffer' directly.
>
> They cannot, by definition, if we intend to keep the current behavior of using
> the same window (except when the use-other-frame vars say not to) and having the
> same `quit-window' behavior.
If using the same window is intentional (and I think in the case of
`view-buffer' this is at least discussable) it will have to use the same
window.
> The problem is not just looking at each occurrence individually. The problem is
> how to get the intended behavior (current window unless frame vars say
> otherwise; same `quit-window' behavior).
Nevertheless we have to look at each occurrence individually.
>> I can't tell. Obviously `same-window-buffer-names' and friends
>> implicitly provide the same service.
>
> How so? If you have a solution to the question I raised, please post it, by all
> means.
By default `same-window-buffer-names' has `display-buffer' emulate the
behavior of `switch-to-buffer' for buffers like *shell* or *mail*. I
don't know whether bookmark buffers would fit that category as well.
Buffers handled by `view-buffer' certainly won't.
>> If and when we enhance `display-buffer' with a same-window argument
>> `switch-to-buffer' could become obsolete (for Elisp calls). OTOH this
>> might lead programmers to call `display-buffer' with the same-window
>> argument in these and other cases.
>
> Is that a discussion topic for emacs-devel? If you're proposing such a change to
> `display-buffer', then it should be discussed there. Such a change shouldn't
> "just happen".
It's discussed in the "dired-pop-to-buffer in wrong place" thread.
>> Does `quit-window' behave differently wrt whether
>> `switch-to-buffer' was called or `pop-to-buffer'?
>
> Try it. I gave the recipe. Use the code I sent that uses `pop-to-buffer' and
> compare, using the C-x 2 C-x 3 situation, with different buffers and with the
> same buffer in all 3 windows.
What do you want me to try? Replace the `switch-to-buffer' call in
`quit-window' with `pop-to-buffer'? That would be dead wrong.
>> > The above code loops forever in some cases (e.g. C-x 2 C-x
>> > 3; put 3 diff buffers in the windows; then the small,
>> > right-hand window will never be used by
>> > `pop-to-buffer'. That is, this will not work:
>> >
>> > (cond ((one-window-p) ; This part works.
>> > (pop-to-buffer (get-buffer-create "*foo*"))
>> > (delete-other-windows))
>> > (t ; This part works except for some windows.
>> > (let ((owin (selected-window)))
>> > (while (not (eq (get-lru-window) owin))
>> > (other-window 1)))
>> > (pop-to-buffer (get-buffer-create "*foo*"))))
>> >
>> > (You'll recommend comparing with the root window, instead
>> > of calling `one-window-p', but that doesn't change the
>> > point in question.)
>>
>> You shouldn't use `other-window' because it doesn't bury the window as
>> you expect. Loop over `window-list' instead.
>
> Please show me what you mean. You can see what I'm trying to do. How to do it?
I do _not_ know what you're trying. If you want to reconstruct how
`display-buffer' finds its window without using the underlying C
primitives then I can only refer you to Stefan's remark on this: You
won't be able to do that.
> And please explain why `other-window' should not be used - in what way doesn't
> it "bury the window as you expect"? Is it also a dwim function? What about
> `next-window' - would that work better?
You said you got an endless loop here. Obviously that happens because
you use `other-window'.
>> I still don't understand why and how you want to control the
>> setting of the LRU window in practice.
>
> I don't really care about the lru window. I was trying to get `pop-to-buffer' to
> use the selected window (whatever that window is, no exceptions).
Above you wanted `pop-to-buffer' follow user customizations. Unless you
settle on either
- respect user customizations thus getting a behavior different from
`switch-to-buffer', or
- implement the `switch-to-buffer' behavior thus not respecting user
customizations,
this won't get us anywhere.
> And also to
> keep the same `quit-window' behavior that you get when you use
> `switch-to-buffer'.
Can you please describe in a few words what a "`quit-window' behavior"
is?
>> > And if you have the same buffer in more than one window,
>> > then such "solutions" also behave differently from
>> > `switch-to-buffer' when you use `quit-window'. E.g.
>> > C-x 2 C-x 3, without using 3 different buffers, etc.
>>
>> In what sense do they behave differently?
>
> When you quit the window, you get a different buffer from what you get when you
> use `switch-to-buffer'.
... use `switch-to-buffer' _where_? In the code of `quit-window'?
> At least that's what I saw. Try the examples I mentioned
> - C-x 2 C-x 3.
Do you mean that the `other-buffer' call in `switch-to-buffer' when
called by `quit-window' chooses another buffer to display? Are you sure
you have set all NORECORD arguments correctly?
> The point is that if you use `switch-to-buffer' and then quit the window, the
> buffer that is displayed is different than what you see if you use
> `pop-to-buffer' (successfully forcing it to use the same window, at least for
> most windows) and then you quit the window. Try the examples I gave, and see for
> yourself.
>
> Again, personally I don't care about preserving the same behavior that
> `switch-to-buffer' gives (wrt using the same window and quitting). But I imagine
> that someone does, or we wouldn't still be using it.
Do you mean the examples where you call `other-window'? `other-window'
calls `select-window' which calls record_buffer so you obviously get a
completely stochastic behavior.
>> > is that such behavior is apparently a common use case.
>> > If replacing `switch-to-buffer' in, say, `view-buffer',
>> > we would presumably want to keep the same behavior as now
>> > for users who do not use `special-display-*' and `pop-up-frames'.
>>
>> So try to experiment with the following: Have `display-buffer'
>> interpret a 'same-window value for the NOT-THIS-WINDOW argument
>> and replace calls like (switch-to-buffer buffer) with
>> (pop-to-buffer buffer 'same-window).
>
> I don't have any time for that, sorry.
Then I won't be able to help you at the moment.
martin
next prev parent reply other threads:[~2009-10-19 7:36 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-18 8:41 bug#4748: 23.1; least recently used window - is it? Drew Adams
2009-10-18 10:24 ` martin rudalics
2009-10-18 16:30 ` Drew Adams
2009-10-18 17:36 ` martin rudalics
2009-10-18 18:48 ` Drew Adams
2009-10-19 7:36 ` martin rudalics [this message]
2009-10-19 1:58 ` Stefan Monnier
2009-10-19 6:28 ` Drew Adams
2009-10-19 13:57 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4ADC16E7.9010406@gmx.at \
--to=rudalics@gmx.at \
--cc=4748@emacsbugs.donarmstrong.com \
--cc=drew.adams@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).