unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
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





  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).