Interactive scrolling on mouse drag.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Campbell Barton d93b69eed6 Cleanup: use brief SPDX license 11 months ago
.elisp-autofmt Add .elisp-autofmt to enable auto-formatting 3 years ago
LICENSE Add license file 3 years ago
readme.rst Add scroll-on-drag-clamp option to prevent scrolling past point-max 1 year ago
scroll-on-drag.el Cleanup: use brief SPDX license 11 months ago


Scroll on Drag

This package exposes ``scroll-on-drag`` where you can click and drag up/down to scroll
at increasing speeds based on the drag distance.

Available via `melpa <>`__.


Having an interactive scroll action that runs a highly varied speeds,
either a few lines, or halfway down a large file.

*Note that this is similar to auto-scroll in Firefox.*


Smooth Scroll
Especially useful when scrolling slowly
*(snaps to the closest line on completion).*
Non-Linear Speed
Larger cursor motion increases scroll speed increasingly
allowing a drag motion to scroll down the entire document, or only a few lines.
See ``cursor-on-drag-motion-accelerate``.
Cancel Support
You can cancel the scroll action for peeking at other parts of the file.
Unlike some minor modes that adjust the behavior of scrolling,
this can be bound to a key and won't impact scrolling in general.


- This is not a mode, instead it is a function you can bind to a key
(typically middle mouse) which scrolls until the button is released.
- Pressing Escape cancels, restoring the previous scroll point.
- Pressing Space keeps the current scroll position, restarting the scroll action.
- Returns ``t`` when scrolled, otherwise ``nil``, allowing click events to be passed through.

You can use the middle mouse button paste (or any other action)
if no scrolling is performed.

.. code-block:: elisp

(lambda ()
(unless (scroll-on-drag)
(mouse-yank-primary t))))

Or when using evil mode.

.. code-block:: elisp

(define-key evil-normal-state-map [down-mouse-2]
(lambda ()
(unless (scroll-on-drag)
(mouse-yank-primary t))))


While the defaults seem to work well, these values can be customized.

``scroll-on-drag-smooth``: t
Smooth (pixel) scroll *(snapped to line on completion).*
``scroll-on-drag-clamp``: nil
Prevent scrolling past the end of the buffer.
``scroll-on-drag-delay``: 0.01, typically in range [0.005 .. 0.1]
Time between scroll updates.
``scroll-on-drag-motion-scale``: 0.25, typically in range [0.01 .. 1.0]
Scale cursor motion, to make scrolling easier to control.
``scroll-on-drag-motion-accelerate``: 0.3, typically in range [0.0 .. 1.0]
Values greater than 0.0 apply non-linear scaling,
this gives control when scrolling individual lines while allowing much
greater speed without having to move the mouse a long distance.
When non-nil, scroll the window under the mouse cursor (even when it's not active)
returning focus on completion.