]> git.eshelyaron.com Git - emacs.git/commitdiff
Make the goal column work for the scrolling commands, too
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 5 Jun 2022 19:35:56 +0000 (21:35 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 5 Jun 2022 19:35:56 +0000 (21:35 +0200)
* doc/emacs/basic.texi (Moving Point): Document it.
* lisp/simple.el (set-goal-column): Update doc string.

* lisp/window.el (scroll-up-command, scroll-down-command): Make
the goal column take effect for these commands, too (bug#17346).

doc/emacs/basic.texi
etc/NEWS
lisp/simple.el
lisp/window.el

index b93a6d5de6e7eb80bd41191422c3755c24ec6442..1a4abdc9ecd799830464ce036970608c4c87d2fd 100644 (file)
@@ -347,11 +347,11 @@ move to the column number specified by the argument's numeric value.
 @kindex C-x C-n
 @findex set-goal-column
 Use the current column of point as the @dfn{semipermanent goal column}
-for @kbd{C-n} and @kbd{C-p} (@code{set-goal-column}) in the current
-buffer.  When a semipermanent goal column is in effect, those commands
-always try to move to this column, or as close as possible to it,
-after moving vertically.  The goal column remains in effect until
-canceled.
+(@code{set-goal-column}) in the current buffer.  When a semipermanent
+goal column is in effect, @kbd{C-n}, @kbd{C-p}, @kbd{<prior>} and
+@kbd{<next>} always try to move to this column, or as close as
+possible to it, after moving vertically.  The goal column remains in
+effect until canceled.
 
 @item C-u C-x C-n
 Cancel the goal column.  Henceforth, @kbd{C-n} and @kbd{C-p} try to
index 8250cac1cc403c01b23bdec6c6362873c3afbf5e..b75c1c9f6c19175e9edae490c4bc227887fe1f35 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -136,6 +136,11 @@ of 'user-emacs-directory'.
 \f
 * Incompatible changes in Emacs 29.1
 
++++
+** Setting the goal columns now also affects '<prior>' and '<next>'.
+Previously, 'C-x C-n' only affected 'next-line' and 'previous-line',
+but it now also affects 'scroll-up-command' and 'scroll-down-command'.
+
 ---
 ** The 'd' command in Dired now more consistently skip dot files.
 In previous Emacs versions, commands like `C-u 10 d' would put the "D"
index a22df8025b3d5cecad4a9ed85a7bb374fe32de29..c749e6e41d62bd6634d15d6e614f8145cfdc87b0 100644 (file)
@@ -8078,13 +8078,18 @@ For motion by visual lines, see `beginning-of-visual-line'."
 (put 'set-goal-column 'disabled t)
 
 (defun set-goal-column (arg)
-  "Set the current horizontal position as a goal for \\[next-line] and \\[previous-line].
+  "Set the current horizontal position as a goal column.
+This goal column will affect the \\[next-line] and \\[previous-line] commands,
+as well as the \\[scroll-up-command] and \\[scroll-down-command] commands.
+
 Those commands will move to this position in the line moved to
 rather than trying to keep the same horizontal position.
-With a non-nil argument ARG, clears out the goal column
-so that \\[next-line] and \\[previous-line] resume vertical motion.
-The goal column is stored in the variable `goal-column'.
-This is a buffer-local setting."
+
+With a non-nil argument ARG, clears out the goal column so that
+these commands resume normal motion.
+
+The goal column is stored in the variable `goal-column'.  This is
+a buffer-local setting."
   (interactive "P")
   (if arg
       (progn
index 5da867715f6c5cec0b5103c7ef1f806b73b70757..1b8fe2b26288e09f7c52fe9048d6a420140bb4b5 100644 (file)
@@ -10103,28 +10103,45 @@ scroll window further, move cursor to the bottom line.
 When point is already on that position, then signal an error.
 A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll downward.
-If ARG is the atom `-', scroll downward by nearly full screen."
+
+If ARG is the atom `-', scroll downward by nearly full screen.
+
+The command \\[set-goal-column] can be used to create a
+semipermanent goal column for this command."
   (interactive "^P")
-  (cond
-   ((null scroll-error-top-bottom)
-    (scroll-up arg))
-   ((eq arg '-)
-    (scroll-down-command nil))
-   ((< (prefix-numeric-value arg) 0)
-    (scroll-down-command (- (prefix-numeric-value arg))))
-   ((eobp)
-    (scroll-up arg))                   ; signal error
-   (t
-    (condition-case nil
-       (scroll-up arg)
-      (end-of-buffer
-       (if arg
-          ;; When scrolling by ARG lines can't be done,
-          ;; move by ARG lines instead.
-          (forward-line arg)
-        ;; When ARG is nil for full-screen scrolling,
-        ;; move to the bottom of the buffer.
-        (goto-char (point-max))))))))
+  (prog1
+      (cond
+       ((null scroll-error-top-bottom)
+        (scroll-up arg))
+       ((eq arg '-)
+        (scroll-down-command nil))
+       ((< (prefix-numeric-value arg) 0)
+        (scroll-down-command (- (prefix-numeric-value arg))))
+       ((eobp)
+        (scroll-up arg))                ; signal error
+       (t
+        (condition-case nil
+           (scroll-up arg)
+          (end-of-buffer
+           (if arg
+              ;; When scrolling by ARG lines can't be done,
+              ;; move by ARG lines instead.
+              (forward-line arg)
+            ;; When ARG is nil for full-screen scrolling,
+            ;; move to the bottom of the buffer.
+            (goto-char (point-max)))))))
+    (scroll-command--goto-goal-column)))
+
+(defun scroll-command--goto-goal-column ()
+  (when goal-column
+    ;; Move to the desired column.
+    (if (and line-move-visual
+             (not (or truncate-lines truncate-partial-width-windows)))
+        ;; Under line-move-visual, goal-column should be
+        ;; interpreted in units of the frame's canonical character
+        ;; width, which is exactly what vertical-motion does.
+        (vertical-motion (cons goal-column 0))
+      (line-move-to-column (truncate goal-column)))))
 
 (put 'scroll-up-command 'scroll-command t)
 
@@ -10140,28 +10157,34 @@ scroll window further, move cursor to the top line.
 When point is already on that position, then signal an error.
 A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll upward.
-If ARG is the atom `-', scroll upward by nearly full screen."
+
+If ARG is the atom `-', scroll upward by nearly full screen.
+
+The command \\[set-goal-column] can be used to create a
+semipermanent goal column for this command."
   (interactive "^P")
-  (cond
-   ((null scroll-error-top-bottom)
-    (scroll-down arg))
-   ((eq arg '-)
-    (scroll-up-command nil))
-   ((< (prefix-numeric-value arg) 0)
-    (scroll-up-command (- (prefix-numeric-value arg))))
-   ((bobp)
-    (scroll-down arg))                 ; signal error
-   (t
-    (condition-case nil
-       (scroll-down arg)
-      (beginning-of-buffer
-       (if arg
-          ;; When scrolling by ARG lines can't be done,
-          ;; move by ARG lines instead.
-          (forward-line (- arg))
-        ;; When ARG is nil for full-screen scrolling,
-        ;; move to the top of the buffer.
-        (goto-char (point-min))))))))
+  (prog1
+      (cond
+       ((null scroll-error-top-bottom)
+        (scroll-down arg))
+       ((eq arg '-)
+        (scroll-up-command nil))
+       ((< (prefix-numeric-value arg) 0)
+        (scroll-up-command (- (prefix-numeric-value arg))))
+       ((bobp)
+        (scroll-down arg))              ; signal error
+       (t
+        (condition-case nil
+           (scroll-down arg)
+          (beginning-of-buffer
+           (if arg
+              ;; When scrolling by ARG lines can't be done,
+              ;; move by ARG lines instead.
+              (forward-line (- arg))
+            ;; When ARG is nil for full-screen scrolling,
+            ;; move to the top of the buffer.
+            (goto-char (point-min)))))))
+    (scroll-command--goto-goal-column)))
 
 (put 'scroll-down-command 'scroll-command t)