Что-нибудь типа set-window-vscroll? Но что-то я сомневаюсь, что это поможет. То есть не знаю, можно ли как-то заставить эту штуку работать так, как тебе хочется. И делал ли кто-нибудь так? Поиграйся, потом расскажи о фейле. :)
(dotimes (i 50)
(sit-for 0.05)
(set-window-vscroll (selected-window) (* i 0.1)))
Только вот скроллинг вниз так не работает. Такие дела. :) Я пока не представляю, как это сделать, надо в исходник лезть. Есть чувство, что вниз оно не поедет. :(
И странно, что не работает вверх. Для чего, интересно, эта функция? Можно, конечно, погрепать по исходникам, чтобы посмотреть, кто и зачем. Сама функция определена в window.c.
Вот только если оборачиваю в defun, то оно после скролла резко встает в исходное положение.
Я так понимаю, что эта функция только визуальный скроллинг делает, но не, как бы это правильнее сказать, не семантический. То есть курсор как бы остается в той же позиции, какой и был. Поэтому после окончания экран снова перерисовывается в соответсвии с текущим положением курсора. Чтобы этого не было, надо манипулировать курсором во время такого скроллинга, то есть рассчитать, где он должен оказаться в момент остановки. Он уже там должен быть - иначе буфер снова перерисуется.
Сюда также добавлю, что sit-for делая паузу, обрабатывает события и делает перерисовку (в отличие от sleep-for). Поэтому, кстати, можно пронаблюдать такое поведение: как только курсор коснется верхней части окна, то буфер снова перерисуется.