|
50 | 50 | :type 'hook) |
51 | 51 |
|
52 | 52 | (defvar goto-line-preview--prev-window nil |
53 | | - "Record down the previous window before we do `goto-line-preview-goto-line' command.") |
| 53 | + "Record down the previous window before we do preivew display.") |
54 | 54 |
|
55 | 55 | (defvar goto-line-preview--prev-line-num nil |
56 | | - "Record down the previous line number before we do `goto-line-preview-goto-line' command.") |
| 56 | + "Record down the previous line number before we do preivew display.") |
| 57 | + |
| 58 | +(defvar goto-line-preview--relative-p nil |
| 59 | + "Flag to see if this command relative.") |
| 60 | + |
| 61 | +(defun goto-line-preview--do (line-num) |
| 62 | + "Do goto LINE-NUM." |
| 63 | + (save-selected-window |
| 64 | + (select-window goto-line-preview--prev-window) |
| 65 | + (goto-char (point-min)) |
| 66 | + (forward-line (1- line-num)))) |
57 | 67 |
|
58 | 68 | (defun goto-line-preview--do-preview () |
59 | 69 | "Do the goto line preview action." |
|
63 | 73 | (select-window goto-line-preview--prev-window) |
64 | 74 | (if line-num-str |
65 | 75 | (let ((line-num (string-to-number line-num-str))) |
| 76 | + (when goto-line-preview--relative-p |
| 77 | + (setq line-num (+ goto-line-preview--prev-line-num line-num))) |
66 | 78 | (unless (zerop line-num) (goto-line-preview--do line-num))) |
67 | 79 | (goto-line-preview--do goto-line-preview--prev-line-num)))))) |
68 | 80 |
|
69 | | -(defun goto-line-preview--do (line-num) |
70 | | - "Do goto LINE-NUM." |
71 | | - (save-selected-window |
72 | | - (select-window goto-line-preview--prev-window) |
73 | | - (goto-char (point-min)) |
74 | | - (forward-line (1- line-num)))) |
75 | | - |
76 | 81 | ;;;###autoload |
77 | 82 | (defun goto-line-preview () |
78 | 83 | "Preview goto line." |
79 | 84 | (interactive) |
80 | | - (let ((window (selected-window)) |
| 85 | + (let ((goto-line-preview--prev-window (selected-window)) |
81 | 86 | (window-point (window-point)) |
| 87 | + (goto-line-preview--prev-line-num (line-number-at-pos)) |
82 | 88 | jumped) |
83 | 89 | (run-hooks 'goto-line-preview-before-hook) |
84 | 90 | (unwind-protect |
85 | | - (let ((goto-line-preview--prev-window (selected-window)) |
86 | | - (goto-line-preview--prev-line-num (line-number-at-pos))) |
87 | | - (setq jumped (read-number "Goto line: "))) |
| 91 | + (setq jumped (read-number |
| 92 | + (if goto-line-preview--relative-p |
| 93 | + "Goto line relative: " |
| 94 | + "Goto line: "))) |
88 | 95 | (unless jumped |
89 | | - (set-window-point window window-point)) |
| 96 | + (set-window-point goto-line-preview--prev-window window-point)) |
90 | 97 | (run-hooks 'goto-line-preview-after-hook)))) |
91 | 98 |
|
| 99 | +;;;###autoload |
| 100 | +(defun goto-line-preview-relative () |
| 101 | + "Preview goto line relative." |
| 102 | + (interactive) |
| 103 | + (let ((goto-line-preview--relative-p t)) |
| 104 | + (goto-line-preview))) |
| 105 | + |
92 | 106 | ;;;###autoload |
93 | 107 | (define-obsolete-function-alias 'goto-line-preview-goto-line 'goto-line-preview) |
94 | 108 |
|
95 | 109 | (defun goto-line-preview--minibuffer-setup () |
96 | 110 | "Locally set up preview hooks for this minibuffer command." |
97 | | - (when (memq this-command '(goto-line-preview goto-line-preview-goto-line)) |
| 111 | + (when (memq this-command '(goto-line-preview |
| 112 | + goto-line-preview-goto-line |
| 113 | + goto-line-preview-relative)) |
98 | 114 | (add-hook 'post-command-hook #'goto-line-preview--do-preview nil t))) |
99 | 115 |
|
100 | 116 | (add-hook 'minibuffer-setup-hook 'goto-line-preview--minibuffer-setup) |
|
0 commit comments