unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#12208: yes-or-no-p escapes with-current-buffer
@ 2012-08-16  4:37 Steve Hafner
  2012-08-16  9:38 ` martin rudalics
  0 siblings, 1 reply; 11+ messages in thread
From: Steve Hafner @ 2012-08-16  4:37 UTC (permalink / raw)
  To: 12208

Open two buffers "buffer1" and  "buffer2" so that both are visible.

Place the following in each buffer

(with-current-buffer "buffer1"
        (goto-char (point-min))
	(yes-or-no-p "")
	(insert "X"))

C-xC-e from buffer1 places "X" at the beginning of the file, while
C-xC-e from buffer2 places an "X" wherever the point was before moving
from buffer1. This doesn't happen if only one buffer is visible; Nor
does it happen if we replace "yes-or-no-p" with "y-or-n-p".
This happens on both 23.3.1 and 24.1.





^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-16  4:37 bug#12208: yes-or-no-p escapes with-current-buffer Steve Hafner
@ 2012-08-16  9:38 ` martin rudalics
  2012-08-16 20:36   ` Steve Hafner
  0 siblings, 1 reply; 11+ messages in thread
From: martin rudalics @ 2012-08-16  9:38 UTC (permalink / raw)
  To: Steve Hafner; +Cc: 12208

 > Open two buffers "buffer1" and  "buffer2" so that both are visible.
 >
 > Place the following in each buffer
 >
 > (with-current-buffer "buffer1"
 >         (goto-char (point-min))
 > 	(yes-or-no-p "")
 > 	(insert "X"))
 >
 > C-xC-e from buffer1 places "X" at the beginning of the file, while
 > C-xC-e from buffer2 places an "X" wherever the point was before moving
 > from buffer1. This doesn't happen if only one buffer is visible; Nor
 > does it happen if we replace "yes-or-no-p" with "y-or-n-p".
 > This happens on both 23.3.1 and 24.1.

Indeed.  What you see is `save-window-excursion' at work.  Let's remove
`yes-or-no-p' from the example.  With emacs -Q in *scratch* evaluate the
following form:

(let ((form
        "(with-current-buffer \"*buffer1*\"
   (goto-char (point-min))
   (save-window-excursion
     nil)
   (setq x (1+ x))
   (insert (format \"%s\" x)))"))
   (setq x 0)
   (switch-to-buffer (get-buffer-create "*buffer1*"))
   (insert form)
   (split-window)
   (other-window 1)
   (switch-to-buffer (get-buffer-create "*buffer2*"))
   (insert form)
   (other-window 1))

Now in any of the two windows go to the end of the buffer and evaluate
the preceding form.  From the *buffer1* window the number is inserted at
position 1, from the *buffer2* window at the position of *buffer1*
before evaluating the form.  If, instead, you used the slightly
different form

(let ((form
        "(with-selected-window (get-buffer-window \"*buffer1*\")
   (goto-char (point-min))
   (save-window-excursion
     nil)
   (setq x (1+ x))
   (insert (format \"%s\" x)))"))
   (setq x 0)
   (switch-to-buffer (get-buffer-create "*buffer1*"))
   (insert form)
   (split-window)
   (other-window 1)
   (switch-to-buffer (get-buffer-create "*buffer2*"))
   (insert form)
   (other-window 1))

both insertions happen at position 1.

martin





^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-16  9:38 ` martin rudalics
@ 2012-08-16 20:36   ` Steve Hafner
  2012-08-17 12:09     ` martin rudalics
  0 siblings, 1 reply; 11+ messages in thread
From: Steve Hafner @ 2012-08-16 20:36 UTC (permalink / raw)
  To: 12208

On Thu, Aug 16, 2012 at 3:38 AM, martin rudalics <rudalics@gmx.at> wrote:
>> Open two buffers "buffer1" and  "buffer2" so that both are visible.
>>
>> Place the following in each buffer
>>
>> (with-current-buffer "buffer1"
>>         (goto-char (point-min))
>>       (yes-or-no-p "")
>>       (insert "X"))
>>
>> C-xC-e from buffer1 places "X" at the beginning of the file, while
>> C-xC-e from buffer2 places an "X" wherever the point was before moving
>> from buffer1. This doesn't happen if only one buffer is visible; Nor
>> does it happen if we replace "yes-or-no-p" with "y-or-n-p".
>> This happens on both 23.3.1 and 24.1.
>
> Indeed.  What you see is `save-window-excursion' at work.  Let's remove
> `yes-or-no-p' from the example.  With emacs -Q in *scratch* evaluate the
> following form:
>
> (let ((form
>        "(with-current-buffer \"*buffer1*\"
>   (goto-char (point-min))
>   (save-window-excursion
>     nil)
>   (setq x (1+ x))
>   (insert (format \"%s\" x)))"))
>   (setq x 0)
>   (switch-to-buffer (get-buffer-create "*buffer1*"))
>   (insert form)
>   (split-window)
>   (other-window 1)
>   (switch-to-buffer (get-buffer-create "*buffer2*"))
>   (insert form)
>   (other-window 1))
>
> Now in any of the two windows go to the end of the buffer and evaluate
> the preceding form.  From the *buffer1* window the number is inserted at
> position 1, from the *buffer2* window at the position of *buffer1*
> before evaluating the form.  If, instead, you used the slightly
> different form
>
> (let ((form
>        "(with-selected-window (get-buffer-window \"*buffer1*\")
>   (goto-char (point-min))
>   (save-window-excursion
>     nil)
>   (setq x (1+ x))
>   (insert (format \"%s\" x)))"))
>   (setq x 0)
>   (switch-to-buffer (get-buffer-create "*buffer1*"))
>   (insert form)
>   (split-window)
>   (other-window 1)
>   (switch-to-buffer (get-buffer-create "*buffer2*"))
>   (insert form)
>   (other-window 1))
>
> both insertions happen at position 1.
>
> martin

Thanks for the examples. If I understand correctly,
save-window-excursion ends with among other things restoring the
window points; and each time a window point is set, the buffer point
is set as well. And while the current buffer is restored,
save-window-excursion does not restore the point in the current
buffer, leaving it at the position set by the window point restore, if
there was one. What I don't understand is the rationale for not
restoring the current buffer point. Perhaps it's just windows have
precedence in a restore.

Steve





^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-16 20:36   ` Steve Hafner
@ 2012-08-17 12:09     ` martin rudalics
  2012-08-17 15:18       ` martin rudalics
  0 siblings, 1 reply; 11+ messages in thread
From: martin rudalics @ 2012-08-17 12:09 UTC (permalink / raw)
  To: Steve Hafner; +Cc: 12208

 > Thanks for the examples.

I wrote them as a first step in order to uncouple the behavior you
observed from `yes-or-no-p'.

 > If I understand correctly,
 > save-window-excursion ends with among other things restoring the
 > window points; and each time a window point is set, the buffer point
 > is set as well.

Conceptually, for any non-selected window, it should restore
`window-point' but leave `point' for that window's buffer alone.  For
the selected window, it should leave `point' where it is.  The problem
seems to occur only when the selected window's buffer is not current at
the time the configuration is saved.

 > And while the current buffer is restored,
 > save-window-excursion does not restore the point in the current
 > buffer, leaving it at the position set by the window point restore, if
 > there was one.

Did you read the code?  Can you tell me where it does do that "window
point restore" which also sets the buffer's `point'?

 > What I don't understand is the rationale for not
 > restoring the current buffer point. Perhaps it's just windows have
 > precedence in a restore.

I've never been able to fully understand neither the purpose nor the
actual implementation of this.  The patch below seems to make it go away
in your case but I have no idea whether it breaks something else.

martin

=== modified file 'src/window.c'
--- src/window.c	2012-08-16 07:58:24 +0000
+++ src/window.c	2012-08-17 11:56:55 +0000
@@ -5636,8 +5636,9 @@
  	       /* As documented in Fcurrent_window_configuration, don't
  		  restore the location of point in the buffer which was
  		  current when the window configuration was recorded.  */
-	       if (!EQ (p->buffer, new_current_buffer)
-		   && XBUFFER (p->buffer) == current_buffer)
+	       if (EQ (p->buffer, new_current_buffer))
+		 Fgoto_char (make_number (old_point));
+	       else if (XBUFFER (p->buffer) == current_buffer)
  		 Fgoto_char (w->pointm);
  	     }
  	   else if (!NILP (w->buffer)







^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-17 12:09     ` martin rudalics
@ 2012-08-17 15:18       ` martin rudalics
  2012-08-17 20:24         ` Steve Hafner
  0 siblings, 1 reply; 11+ messages in thread
From: martin rudalics @ 2012-08-17 15:18 UTC (permalink / raw)
  To: Steve Hafner; +Cc: 12208

 > Did you read the code?  Can you tell me where it does do that "window
 > point restore" which also sets the buffer's `point'?

... just forgot to look at my beloved enemy.

run_window_configuration_change_hook sets `point' from `window-point'
via select_window_norecord.

martin





^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-17 15:18       ` martin rudalics
@ 2012-08-17 20:24         ` Steve Hafner
  2012-08-18  2:55           ` Steve Hafner
  0 siblings, 1 reply; 11+ messages in thread
From: Steve Hafner @ 2012-08-17 20:24 UTC (permalink / raw)
  To: 12208

On Fri, Aug 17, 2012 at 9:18 AM, martin rudalics <rudalics@gmx.at> wrote:
>> Did you read the code?  Can you tell me where it does do that "window
>> point restore" which also sets the buffer's `point'?
>
> ... just forgot to look at my beloved enemy.
>
> run_window_configuration_change_hook sets `point' from `window-point'
> via select_window_norecord.
>

No, I didn't read the code, but I'm glad you found it. The problem
originally showed up in Org-mode, and I had fun chasing it through the
lisp. Then it disappeared into C, and I've never looked at the Emacs C
code before. I'm sorry to say I can't judge whether or not your patch
breaks anything.

Steve





^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-17 20:24         ` Steve Hafner
@ 2012-08-18  2:55           ` Steve Hafner
  2012-08-18 13:15             ` martin rudalics
  0 siblings, 1 reply; 11+ messages in thread
From: Steve Hafner @ 2012-08-18  2:55 UTC (permalink / raw)
  To: 12208

On Fri, Aug 17, 2012 at 2:24 PM, Steve Hafner <steve.b.hafner@gmail.com> wrote:
> code before. I'm sorry to say I can't judge whether or not your patch
> breaks anything.


Actually, I'm coming up with a few problems. I applied your patch to
Git sources, and evaluating from buffer1 leaves the point at position
2.  Things seem to work correctly in buffer2, though.

And trying yes-or-no-p again, the behavior is the same as in my original post:


(let ((form
       "(with-current-buffer \"*buffer1*\"
  (goto-char (point-min))
  (yes-or-no-p \"\")
  (setq x (1+ x))
  (insert (format \"%s\" x)))"))
  (setq x 0)
  (switch-to-buffer (get-buffer-create "*buffer1*"))
  (insert form)
  (split-window)
  (other-window 1)
  (switch-to-buffer (get-buffer-create "*buffer2*"))
  (insert form)
  (other-window 1))


Steve





^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-18  2:55           ` Steve Hafner
@ 2012-08-18 13:15             ` martin rudalics
  2012-08-18 16:39               ` Steve Hafner
  2012-08-27  9:15               ` martin rudalics
  0 siblings, 2 replies; 11+ messages in thread
From: martin rudalics @ 2012-08-18 13:15 UTC (permalink / raw)
  To: Steve Hafner; +Cc: 12208

 > Actually, I'm coming up with a few problems. I applied your patch to
 > Git sources, and evaluating from buffer1 leaves the point at position
 > 2.  Things seem to work correctly in buffer2, though.
 >
 > And trying yes-or-no-p again, the behavior is the same as in my original post:
 >
 >
 > (let ((form
 >        "(with-current-buffer \"*buffer1*\"
 >   (goto-char (point-min))
 >   (yes-or-no-p \"\")
 >   (setq x (1+ x))
 >   (insert (format \"%s\" x)))"))
 >   (setq x 0)
 >   (switch-to-buffer (get-buffer-create "*buffer1*"))
 >   (insert form)
 >   (split-window)
 >   (other-window 1)
 >   (switch-to-buffer (get-buffer-create "*buffer2*"))
 >   (insert form)
 >   (other-window 1))

Sorry, the patch worked only when the selected window did not change.
Please try the one below.

Thanks, martin


=== modified file 'src/window.c'
--- src/window.c	2012-08-18 06:06:39 +0000
+++ src/window.c	2012-08-18 13:09:15 +0000
@@ -5889,7 +5889,13 @@
      }

    if (!NILP (new_current_buffer))
-    Fset_buffer (new_current_buffer);
+    {
+      Fset_buffer (new_current_buffer);
+      /* If the new current buffer doesn't appear in the selected
+	 window, go to its old point.  */
+      if (!EQ (XWINDOW (data->current_window)->buffer, new_current_buffer))
+	Fgoto_char (make_number (old_point));
+    }

    Vminibuf_scroll_window = data->minibuf_scroll_window;
    minibuf_selected_window = data->minibuf_selected_window;







^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-18 13:15             ` martin rudalics
@ 2012-08-18 16:39               ` Steve Hafner
  2012-08-18 17:38                 ` martin rudalics
  2012-08-27  9:15               ` martin rudalics
  1 sibling, 1 reply; 11+ messages in thread
From: Steve Hafner @ 2012-08-18 16:39 UTC (permalink / raw)
  To: 12208

On Sat, Aug 18, 2012 at 7:15 AM, martin rudalics <rudalics@gmx.at> wrote:
>> Actually, I'm coming up with a few problems. I applied your patch to
>> Git sources, and evaluating from buffer1 leaves the point at position
>> 2.  Things seem to work correctly in buffer2, though.

My comment here with respect to the point ending at position 2 being a
problem was just confusion on my part. I think it was the correct
result....


>>
>> And trying yes-or-no-p again, the behavior is the same as in my original
>> post:
>>
>>
>> (let ((form
>>        "(with-current-buffer \"*buffer1*\"
>>   (goto-char (point-min))
>>   (yes-or-no-p \"\")
>>   (setq x (1+ x))
>>   (insert (format \"%s\" x)))"))
>>   (setq x 0)
>>   (switch-to-buffer (get-buffer-create "*buffer1*"))
>>   (insert form)
>>   (split-window)
>>   (other-window 1)
>>   (switch-to-buffer (get-buffer-create "*buffer2*"))
>>   (insert form)
>>   (other-window 1))
>
> Sorry, the patch worked only when the selected window did not change.
> Please try the one below.
>


Thanks, it all seems to work now as I would expect, including in
Org-mode where I initially ran into the problem.

Steve





^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-18 16:39               ` Steve Hafner
@ 2012-08-18 17:38                 ` martin rudalics
  0 siblings, 0 replies; 11+ messages in thread
From: martin rudalics @ 2012-08-18 17:38 UTC (permalink / raw)
  To: Steve Hafner; +Cc: 12208

 > Thanks, it all seems to work now as I would expect, including in
 > Org-mode where I initially ran into the problem.

I'll keep my Emacs running with the change for a week or so.  If I don't
see any problems, I'll install it then.  If I forget, please remind me.

Thanks, martin







^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#12208: yes-or-no-p escapes with-current-buffer
  2012-08-18 13:15             ` martin rudalics
  2012-08-18 16:39               ` Steve Hafner
@ 2012-08-27  9:15               ` martin rudalics
  1 sibling, 0 replies; 11+ messages in thread
From: martin rudalics @ 2012-08-27  9:15 UTC (permalink / raw)
  To: 12208-done; +Cc: Steve Hafner

> === modified file 'src/window.c'
> --- src/window.c    2012-08-18 06:06:39 +0000
> +++ src/window.c    2012-08-18 13:09:15 +0000
> @@ -5889,7 +5889,13 @@
>      }
> 
>    if (!NILP (new_current_buffer))
> -    Fset_buffer (new_current_buffer);
> +    {
> +      Fset_buffer (new_current_buffer);
> +      /* If the new current buffer doesn't appear in the selected
> +     window, go to its old point.  */
> +      if (!EQ (XWINDOW (data->current_window)->buffer, 
> new_current_buffer))
> +    Fgoto_char (make_number (old_point));
> +    }
> 
>    Vminibuf_scroll_window = data->minibuf_scroll_window;
>    minibuf_selected_window = data->minibuf_selected_window;

Installed in revision 109789 on trunk.  Bug closed.

martin






^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2012-08-27  9:15 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-16  4:37 bug#12208: yes-or-no-p escapes with-current-buffer Steve Hafner
2012-08-16  9:38 ` martin rudalics
2012-08-16 20:36   ` Steve Hafner
2012-08-17 12:09     ` martin rudalics
2012-08-17 15:18       ` martin rudalics
2012-08-17 20:24         ` Steve Hafner
2012-08-18  2:55           ` Steve Hafner
2012-08-18 13:15             ` martin rudalics
2012-08-18 16:39               ` Steve Hafner
2012-08-18 17:38                 ` martin rudalics
2012-08-27  9:15               ` martin rudalics

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