Skip to content

Commit 3abef26

Browse files
committed
Add aligment.
1 parent 793fa71 commit 3abef26

File tree

1 file changed

+44
-5
lines changed

1 file changed

+44
-5
lines changed

better-scroll.el

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,24 @@
3434

3535
(require 'cl-lib)
3636

37+
(defgroup better-scroll nil
38+
"Improve user experience when scrolling window."
39+
:prefix "better-scroll-"
40+
:group 'tool
41+
:link '(url-link :tag "Repository" "https://github.com/jcs-elpa/better-scroll"))
42+
43+
(defcustom better-scroll-align-type 'center
44+
"Type of scroll's aligment to cursor position."
45+
:type '(choice (const :tag "center" center)
46+
(const :tag "relative" relative))
47+
:group 'better-scroll)
48+
49+
;;; Util
50+
51+
(defun better-scroll--goto-line (ln)
52+
"Goto LN line number."
53+
(goto-char (point-min)) (forward-line (1- ln)))
54+
3755
(defun better-scroll--recenter-positions (type)
3856
"Return the recenter position value by TYPE."
3957
(cl-case type (top '(top)) (middle '(middle)) (bottom '(bottom))))
@@ -48,20 +66,41 @@
4866
(let ((recenter-positions (better-scroll--recenter-positions type)))
4967
(move-to-window-line-top-bottom)))
5068

69+
(defun better-scroll--first-display-line ()
70+
"Return the first display line number."
71+
(save-excursion (move-to-window-line 0) (line-number-at-pos nil t)))
72+
73+
(defun better-scroll--line-diff-to-first ()
74+
"Difference of first display line number and current line number."
75+
(- (line-number-at-pos nil t) (better-scroll--first-display-line)))
76+
77+
;;; Core
78+
79+
(defun better-scroll--do-relative (rel-ln)
80+
"Do the relative line action by REL-LN."
81+
(better-scroll--goto-line (+ (better-scroll--first-display-line) rel-ln)))
82+
83+
(defun better-scroll--do-by-type (rel-ln)
84+
"Do scroll action by passing all needed params, REL-LN."
85+
(cl-case better-scroll-align-type
86+
('center
87+
(better-scroll--move-to-window-line-top-bottom 'middle)
88+
(when (= (point) (point-max)) (better-scroll--recenter-top-bottom 'middle)))
89+
('relative (better-scroll--do-relative rel-ln))))
90+
5191
;;;###autoload
5292
(defun better-scroll-down ()
5393
"Scroll down."
5494
(interactive)
55-
(scroll-down)
56-
(better-scroll--move-to-window-line-top-bottom 'middle))
95+
(let ((rel-ln (better-scroll--line-diff-to-first)))
96+
(scroll-down) (better-scroll--do-by-type rel-ln)))
5797

5898
;;;###autoload
5999
(defun better-scroll-up ()
60100
"Scroll up."
61101
(interactive)
62-
(scroll-up)
63-
(better-scroll--move-to-window-line-top-bottom 'middle)
64-
(when (= (point) (point-max)) (better-scroll--recenter-top-bottom 'middle)))
102+
(let ((rel-ln (better-scroll--line-diff-to-first)))
103+
(scroll-up) (better-scroll--do-by-type rel-ln)))
65104

66105
;;;###autoload
67106
(defun better-scroll-down-other-window ()

0 commit comments

Comments
 (0)