Subject: bug#1073: 23.0.60; Bad interaction between compilation-scroll-output and dedicated windows

From: Stefan Monnier <[email-masked]>
Date: Sat, 04 Oct 2008 20:54:01 -0400

>> When this code in `compilation-start' is executed:
>> 
>> (if (buffer-local-value 'compilation-scroll-output outbuf)
>> (save-selected-window
>> (select-window outwin)
>> (goto-char (point-max))))
>> 
>> outwin is #<window 13 on *compilation*>
>> and after the select-window call (selected-window) is #<window 13
>> on *compilation*>.  However, at this point (current-buffer)
>> returns *test*, rather than *compilation*.

> This is a very, very great nuisance of `select-window'.  Would the
> attached patch DTRT?

> martin

> *** progmodes/compile.el.~1.476.~	2008-06-13 18:22:16.000000000 +0200
> --- progmodes/compile.el	2008-10-03 14:31:45.718750000 +0200
> ***************
> *** 1280,1289 ****
>   		(cons proc compilation-in-progress))))
>         ;; Now finally cd to where the shell started make/grep/...
>         (setq default-directory thisdir))
> !     (if (buffer-local-value 'compilation-scroll-output outbuf)
> ! 	(save-selected-window
> ! 	  (select-window outwin)
> ! 	  (goto-char (point-max))))
>       ;; Make it so the next C-x ` will use this buffer.
>       (setq next-error-last-buffer outbuf)))
  
> --- 1280,1290 ----
>   		(cons proc compilation-in-progress))))
>         ;; Now finally cd to where the shell started make/grep/...
>         (setq default-directory thisdir))
> ! 
> !     (with-current-buffer (window-buffer outwin)
> !       (when (local-variable-p 'compilation-scroll-output)
> ! 	(goto-char (point-max))))
> ! 
>       ;; Make it so the next C-x ` will use this buffer.
>       (setq next-error-last-buffer outbuf)))
  
I think the select-window thingy is/was needed in order to make sure we
move point in the relevant window, rather than just moving point in the
relevant buffer.
So maye something like:

    (with-selected-window outwin
      (with-current-buffer (window-buffer outwin)
        ...))

would be better.

        Stefan