From 318e6300373f5d67f5d4972897eddb2b3bcff85b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Apr 2025 17:26:48 -0400 Subject: [PATCH] feat(smooth-scroll): add +interpolate flag Adds optional scroll interpolation/animation in #8335 via the good-scroll package. Command support is light right now, but I plan to expand on it later, and I welcome PRs to do so in the meantime. Ref: #8335 --- modules/ui/smooth-scroll/README.org | 27 ++++++++++++++++++++------- modules/ui/smooth-scroll/config.el | 20 ++++++++++++++++++++ modules/ui/smooth-scroll/packages.el | 3 +++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/modules/ui/smooth-scroll/README.org b/modules/ui/smooth-scroll/README.org index 80e813282..299377a90 100644 --- a/modules/ui/smooth-scroll/README.org +++ b/modules/ui/smooth-scroll/README.org @@ -4,18 +4,21 @@ #+since: 25.05.0 * Description :unfold: -This module activates OS-independent smooth scrolling in Emacs. This primarily -benefits trackpad and scroll wheel users (not so much those that scroll via -their keyboards), by utilizing the [[https://github.com/jdtsmith/ultra-scroll][ultra-scroll]] package. +This module enables multiple kinds of smooth scrolling in Emacs. Its primary +function is to make input scrolling (on trackpads and scroll wheels) +pixel-smooth. With the =+interpolate= flag, it performs interpolated scrolling on +a growing list of scroll commands that traverse larger distances, smoothly +scrolling from point A to B on PgUp or PgDown (or [[kbd:][C-d]]/[[kbd:][C-u]] for Evil users). #+begin_quote  This module requires Emacs 29.1 or newer. #+end_quote #+begin_quote -  For optimal performance from this module, it's highly recommended you use - Emacs with native-compilation. MacOS users may also have a better experience - using the [[https://bitbucket.org/mituharu/emacs-mac][emacs-mac]] fork of Emacs, available via Homebrew. +  Scroll interpolation support is currently limited to the ~scroll-up~ and + ~scroll-down~ commands, and any command that calls them (like ~evil-scroll-down~ + and ~evil-scroll-up~), so you're likely to find many scroll commands are not + interpolated. We welcome PRs to expand its support. #+end_quote ** Maintainers @@ -24,10 +27,14 @@ their keyboards), by utilizing the [[https://github.com/jdtsmith/ultra-scroll][u [[doom-contrib-maintainer:][Become a maintainer?]] ** Module flags -/This module has no flags./ +- +interpolate :: + Enables scroll interpolation for some larger-step scrolling commands. E.g. + PgUp and PgDown (or C-d/C-u for Evil users) will now smoothly scroll to its + destination rather than jump to it. ** Packages - [[doom-package:ultra-scroll]] +- [[doom-package:good-scroll]] if [[doom-module:+interpolate]] ** Hacks /No hacks documented for this module./ @@ -41,6 +48,12 @@ their keyboards), by utilizing the [[https://github.com/jdtsmith/ultra-scroll][u /This module has no external requirements./ +#+begin_quote +  For optimal performance from this module, it's highly recommended you use + Emacs with native-compilation. MacOS users may also have a better experience + using the [[https://bitbucket.org/mituharu/emacs-mac][emacs-mac]] fork of Emacs, available via Homebrew. +#+end_quote + * Usage This module only needs to be activated to experience its benefits. diff --git a/modules/ui/smooth-scroll/config.el b/modules/ui/smooth-scroll/config.el index 64a16002a..77db49da8 100644 --- a/modules/ui/smooth-scroll/config.el +++ b/modules/ui/smooth-scroll/config.el @@ -11,3 +11,23 @@ (add-hook 'ultra-scroll-hide-functions #'hl-todo-mode) (add-hook 'ultra-scroll-hide-functions #'diff-hl-flydiff-mode) (add-hook 'ultra-scroll-hide-functions #'jit-lock-mode)) + + +(use-package good-scroll + :when (modulep! +interpolate) + :hook (doom-first-input . good-scroll-mode) + :config + (defun good-scroll--convert-line-to-step (line) + (cond ((integerp line) (* line (line-pixel-height))) + ((or (null line) (memq '- line)) + (- (good-scroll--window-usable-height) + (* next-screen-context-lines (line-pixel-height)))) + ((line-pixel-height)))) + + (defadvice! good-scroll--scroll-up (&optional arg) + :override #'scroll-up + (good-scroll-move (good-scroll--convert-line-to-step arg))) + + (defadvice! good-scroll--scroll-down (&optional arg) + :override #'scroll-down + (good-scroll-move (- (good-scroll--convert-line-to-step arg))))) diff --git a/modules/ui/smooth-scroll/packages.el b/modules/ui/smooth-scroll/packages.el index 555704961..61e95ca93 100644 --- a/modules/ui/smooth-scroll/packages.el +++ b/modules/ui/smooth-scroll/packages.el @@ -4,3 +4,6 @@ (package! ultra-scroll :recipe (:host github :repo "jdtsmith/ultra-scroll") :pin "b72c507f6702db18d971a6b6bdc692e260f21159") + +(when (modulep! +interpolate) + (package! good-scroll :pin "a7ffd5c0e5935cebd545a0570f64949077f71ee3"))