44
votes

I find myself wanting to use Emacs, mostly because of org-mode, but I'm having a lot of trouble getting used to the jerky scrolling behavior. I know this is a well-known problem/eccentricity of Emacs and that there are various ways to minimize jerkiness when scrolling. But nothing I've tried so far works very well at all.

The main suggestions I've seen are (setq scroll-conservatively 10000) or to use the more comprehensive fix available in smooth-scrolling.el . I think both of these might work okay for me, but both fail miserably when I hold down the up-arrow and down-arrow key to get repeated scrolling up or down. When I do this the screen freezes and I see the scroll-indicator-bar in the scroll margin move up or down. The screen does not refresh until I stop holding down the up-arrow or down-arrow key.

If I repeatedly press up-arrow or down-arrow then I do get behavior close to what I want, i.e., the screen scrolls smoothly and cursor key does not get reset to middle of screen. But this is undesirable because (1) it requires repeated keypresses and (2) I assume the scrolling is at a slower rate than what I should be able to get in better solution.

The problem with holding the cursor keys down seems to me to be that the repeat rate of up-arrow or down-arrow is so fast that it triggers emacs to stop the screen refresh until key is released. I wonder whether a possible fix for me would be to add some lag into the key-repeat rate or the rate at which the next/previous line function is called in emacs.

I haven't seen this reported as a problem by others and I wonder whether other people have experienced same behavior. What's best way to fix things so I can hold the up/down arrow keys down and have repeat rate that's slow enough so that the screen doesn't freeze?

UPDATE: The above behavior is what I get when I run emacs on Win7/64. On same machine when I run emacs inside a VirtualBox VM running Ubuntu 10.04 it's no problem to get scrolling that works fine even when cursor keys are held down.

7
The large value of scroll-conservatively worked to solve this for me... maybe your computer is slower than your keyboard? :)Trey Jackson
Trey -- Thanks, I was wondering whether that might be the case. So it seems I'll need some further step to get smooth scrolling. My computer is not a monster machine, but I wouldn't call it slow; it's a laptop with a Pentium SU4100, dual core 1.3GHz chip and 4GB RAM.Herbert Sitz
please, could you tell us if you have emacs on Windows, Un*x, whether it's in a terminal window (-nw) inside a desktop environment like gnome or outside a GUI (screen) ?Jérôme Radix

7 Answers

54
votes

I had the same problem! Tried all the scroll-* settings, didn't help when holding down arrow. But found this on gnu.emacs.help which finally worked (for me at least):

(setq redisplay-dont-pause t)

This is what I have in .emacs for now:

(setq redisplay-dont-pause t
  scroll-margin 1
  scroll-step 1
  scroll-conservatively 10000
  scroll-preserve-screen-position 1)
9
votes

scroll-conservatively helps, but I also like a margin so that I can see what's coming up as a scroll -- it keeps context on the screen for me. These settings have worked well for me an a wide variety of computers for a few years:

(setq scroll-conservatively 10)
(setq scroll-margin 7)
6
votes

Try this:

;; scroll one line at a time (less "jumpy" than defaults)
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ; one line at a time
(setq mouse-wheel-progressive-speed nil)            ; don't accelerate scrolling
(setq-default smooth-scroll-margin 0)
(setq scroll-step 1
      scroll-margin 1
      scroll-conservatively 100000)

And use pager.el.

;; Pager
(require 'pager-default-keybindings)

That's what I want :) Enjoy!

3
votes

Note that this isn't mentioned anywhere here, but I found for larger files I ended up running into some irritating lag, where scrolling would get behind font updating.

This relies on redrawing not being so slow that the system gets too far behind in its updating.

See this question for details.


These settings worked well for me:

(setq
 scroll-conservatively 1000                     ;; only 'jump' when moving this far
 scroll-margin 4                                ;; scroll N lines to screen edge
 scroll-step 1                                  ;; keyboard scroll one line at a time
 mouse-wheel-scroll-amount '(6 ((shift) . 1))   ;; mouse scroll N lines
 mouse-wheel-progressive-speed nil              ;; don't accelerate scrolling

 redisplay-dont-pause t                         ;; don't pause display on input

 ;; Always redraw immediately when scrolling,
 ;; more responsive and doesn't hang!
 fast-but-imprecise-scrolling nil
 jit-lock-defer-time 0
 )
2
votes

This behavior is not encountered on all platforms. For those platforms that pose problem, I would recommend to use this setting :

(setq scroll-conservatively 0)

It places the cursor on the middle of the screen each time you scroll to another page.

1
votes

I'm very happy with Adam Spiers' smooth-scrolling, as rpdillon suggested. I thought it deserves an answer of its own.

0
votes

I can scroll by only one line with M-Up / M-Down by adding this to my .emacs :

(global-set-key (kbd "M-<down>") (lambda () (interactive) (scroll-up   1)))
(global-set-key (kbd "M-<up>")   (lambda () (interactive) (scroll-down 1)))