Subject: bug#20100: 24.4.91; Can't scroll a window while in minibuffer

From: Oleh Krehel <[email-masked]>
Date: Fri, 13 Mar 2015 18:10:09 +0100

Hi Martin,

On Fri, Mar 13, 2015 at 5:58 PM, martin rudalics <[email-masked]> wrote:
>> I'm trying to write a completion package using `read-from-minibuffer'
>> combined with `post-command-hook'.
>>
>> Everything is working OK, except when I want to sync the current
>> completion candidate (one of buffer's lines) with the corresponding line
>> in the buffer.
>>
>> This code, specifically `recenter', doesn't work:
>>
>> (with-current-buffer buf
>>    (goto-char (point-min))
>>    (forward-line (1- num))
>>    (recenter))
>
> I suppose that at the time you invoke `recenter', the selected window
> doesn't show `buf'.  When with emacs -Q I do
>
> (let ((buffer (get-buffer-create "*buffer*"))
>       (line 0))
>   (set-window-buffer nil buffer)
>   (with-current-buffer buffer
>     (while (< line 100)
>       (insert (format "%02d\n" line))
>       (setq line (1+ line))))
>
>   (with-current-buffer buffer
>     (goto-char (point-min))
>     (forward-line 25)
>     (recenter)))
>
> then I see the line starting with "25" centered in the selected window.
> Can you try modifying my example such that it "doesn't work for you"?

You need to be in the minibuffer in order for the effect to occur,
which you're not.

See my question on Emacs Stack Exchange for a simple way to reproduce the issue:
http://emacs.stackexchange.com/questions/9967/how-to-scroll-another-buffer-while-in-minibuffer

However, what I'm actually trying to do is here:
https://raw.githubusercontent.com/abo-abo/swiper/master/ivy.el

> The fact that you apparently have to
>
> (setf (window-point wnd) (point))
>
> seems to suport my claim above, namely that `wnd' is not selected at
> that time.

It is selected, only the minibufer is interfering.

>> Still, it's not a perfect solution, since even after setting
>> `window-point', (window-start wnd) and (window-end wnd t) will not
>> return the correct thing.
>
> What is the wrong thing and what would the correct thing be?  The only
> function that should work "correctly" here is `set-window-start'.

`set-window-start' doesn't work. The issue is that the scroll
happended and visibly the window start has changed, but `window-start`
still returns the old value.

> Beyond what you can read in the documentations, explaining `recenter' is
> hardly possible without explaining redisplay as well.  You have to look
> at its implementation.

Thanks, I might get to that eventually, I just wanted to hear the
expert opinion, maybe this is a
known problem. My current work-around for re-computing the changed
`window-start' and `window-end'
is to call `forward-line' with the window height parameter.

Oleh