|
48 | 48 |
|
49 | 49 | ;;; Util |
50 | 50 |
|
51 | | -(defun better-scroll--goto-line (ln) |
52 | | - "Goto LN line number." |
53 | | - (goto-char (point-min)) (forward-line (1- ln))) |
54 | | - |
55 | 51 | (defun better-scroll--recenter-positions (type) |
56 | 52 | "Return the recenter position value by TYPE." |
57 | 53 | (cl-case type (top '(top)) (middle '(middle)) (bottom '(bottom)))) |
|
66 | 62 | (let ((recenter-positions (better-scroll--recenter-positions type))) |
67 | 63 | (move-to-window-line-top-bottom))) |
68 | 64 |
|
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 | 65 | ;;; Core |
78 | 66 |
|
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 | | - |
91 | 67 | ;;;###autoload |
92 | 68 | (defun better-scroll-down () |
93 | 69 | "Scroll down." |
94 | 70 | (interactive) |
95 | | - (let ((rel-ln (better-scroll--line-diff-to-first))) |
96 | | - (scroll-down) (better-scroll--do-by-type rel-ln))) |
| 71 | + (let ((scroll-preserve-screen-position (equal better-scroll-align-type 'relative))) |
| 72 | + (scroll-down) |
| 73 | + (when (equal better-scroll-align-type 'center) |
| 74 | + (better-scroll--move-to-window-line-top-bottom 'middle)))) |
97 | 75 |
|
98 | 76 | ;;;###autoload |
99 | 77 | (defun better-scroll-up () |
100 | 78 | "Scroll up." |
101 | 79 | (interactive) |
102 | | - (let ((rel-ln (better-scroll--line-diff-to-first))) |
103 | | - (scroll-up) (better-scroll--do-by-type rel-ln))) |
| 80 | + (let ((scroll-preserve-screen-position (equal better-scroll-align-type 'relative))) |
| 81 | + (scroll-up) |
| 82 | + (when (equal better-scroll-align-type 'center) |
| 83 | + (better-scroll--move-to-window-line-top-bottom 'middle) |
| 84 | + (when (= (point) (point-max)) (better-scroll--recenter-top-bottom 'middle))))) |
104 | 85 |
|
105 | 86 | ;;;###autoload |
106 | 87 | (defun better-scroll-down-other-window () |
|
0 commit comments