From 5eb9800c420ca6d889313e462b4a89b45cf97577 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Mon, 19 Jan 2026 20:39:27 +0200 Subject: [PATCH] Allow non-interactive calls of 'goto-line' (bug#80150) * lisp/simple.el (goto-line, goto-line-relative): Add new arg 'interactive'. Remove 'declare' with 'interactive-only'. Don't push the mark when called non-interactively. --- lisp/simple.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lisp/simple.el b/lisp/simple.el index f06e473d383..774dab254c3 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1638,7 +1638,7 @@ Note that on changing from non-nil to nil, the former contents of 'goto-line-history) buffer)))) -(defun goto-line (line &optional buffer relative) +(defun goto-line (line &optional buffer relative interactive) "Go to LINE, counting from line 1 at beginning of buffer. If called interactively, a numeric prefix argument specifies LINE; without a numeric prefix argument, read LINE from the @@ -1659,21 +1659,23 @@ Prior to moving point, this function sets the mark (without activating it), unless Transient Mark mode is enabled and the mark is already active. +A non-nil INTERACTIVE argument means to push the mark. + This function is usually the wrong thing to use in a Lisp program. What you probably want instead is something like: (goto-char (point-min)) (forward-line (1- N)) If at all possible, an even better solution is to use char counts rather than line counts." - (declare (interactive-only forward-line)) - (interactive (goto-line-read-args)) + (interactive (append (goto-line-read-args) '(nil t))) ;; Switch to the desired buffer, one way or another. (if buffer (let ((window (get-buffer-window buffer))) (if window (select-window window) (switch-to-buffer-other-window buffer)))) ;; Leave mark at previous position - (or (region-active-p) (push-mark)) + (when interactive + (or (region-active-p) (push-mark))) ;; Move to the specified line number in that buffer. (let ((pos (save-restriction (unless relative (widen)) @@ -1690,14 +1692,13 @@ rather than line counts." (widen)) (goto-char pos))) -(defun goto-line-relative (line &optional buffer) +(defun goto-line-relative (line &optional buffer interactive) "Go to LINE, counting from line at (point-min). The line number is relative to the accessible portion of the narrowed -buffer. The argument BUFFER is the same as in the function `goto-line'." - (declare (interactive-only forward-line)) - (interactive (goto-line-read-args t)) - (with-suppressed-warnings ((interactive-only goto-line)) - (goto-line line buffer t))) +buffer. The argument BUFFER is the same as in the function `goto-line'. +A non-nil INTERACTIVE argument means to push the mark." + (interactive (append (goto-line-read-args t) t)) + (goto-line line buffer t interactive)) (defun count-words-region (start end &optional arg) "Count the number of words in the region.