[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with
From: |
Juri Linkov |
Subject: |
bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer |
Date: |
Tue, 22 Sep 2020 21:08:10 +0300 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu) |
>>> So a new command and keystroke seems warranted. How about...
>>> `M-g M-v'? (The mnemonic is "goto visual line".)
>>
>> C-x n g go to narrowed line
>
> Perhaps both? The keystroke makes sense in both contexts -- as a
> variation on `M-g M-g', and in the group of narrowing keystroke.
Yep, having both is a win-win situation.
Here is the patch that:
1. leaves the existing 'goto-line' completely backward-compatible
(actually a small difference is that in a narrowed buffer it displays
now the prompt "Goto absolute line:" instead of just "Goto line:")
2. adds two optional args RELATIVE and WIDEN to 'goto-line';
3. adds two new commands 'goto-line-absolute' and 'goto-line-relative':
3.1. 'goto-line-absolute' widens the buffer and doesn't narrow it back;
3.2. 'goto-line-relative' is bound in Info mode to `M-g M-g'.
If this is ok, then 'goto-line-relative' could be bound to
`M-g M-v' and `C-x n g'.
diff --git a/lisp/info.el b/lisp/info.el
index e4f75b481f..20633fd059 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -4053,6 +4053,7 @@ Info-mode-map
(define-key map "^" 'Info-up)
(define-key map "," 'Info-index-next)
(define-key map "\177" 'Info-scroll-down)
+ (define-key map [remap goto-line] 'goto-line-relative)
(define-key map [mouse-2] 'Info-mouse-follow-nearest-node)
(define-key map [follow-link] 'mouse-face)
(define-key map [XF86Back] 'Info-history-back)
diff --git a/lisp/simple.el b/lisp/simple.el
index 050c81a410..724d2d96aa 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -1231,7 +1231,38 @@ goto-line-history
"History of values entered with `goto-line'.")
(make-variable-buffer-local 'goto-line-history)
-(defun goto-line (line &optional buffer)
+(defun goto-line-read-args (&optional relative)
+ "Read arguments for `goto-line' related commands."
+ (if (and current-prefix-arg (not (consp current-prefix-arg)))
+ (list (prefix-numeric-value current-prefix-arg))
+ ;; Look for a default, a number in the buffer at point.
+ (let* ((default
+ (save-excursion
+ (skip-chars-backward "0-9")
+ (if (looking-at "[0-9]")
+ (string-to-number
+ (buffer-substring-no-properties
+ (point)
+ (progn (skip-chars-forward "0-9")
+ (point)))))))
+ ;; Decide if we're switching buffers.
+ (buffer
+ (if (consp current-prefix-arg)
+ (other-buffer (current-buffer) t)))
+ (buffer-prompt
+ (if buffer
+ (concat " in " (buffer-name buffer))
+ "")))
+ ;; Read the argument, offering that number (if any) as default.
+ (list (read-number (format "Goto%s line%s: "
+ (if (= (point-min) 1) ""
+ (if relative " relative" " absolute"))
+ buffer-prompt)
+ (list default (line-number-at-pos))
+ 'goto-line-history)
+ buffer))))
+
+(defun goto-line (line &optional buffer relative widen)
"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
@@ -1241,6 +1272,12 @@ goto-line
move to line LINE there. If called interactively with \\[universal-argument]
as argument, BUFFER is the most recently selected other buffer.
+If optional argument RELATIVE is non-nil, counting is relative
+from the beginning of the narrowed buffer.
+
+If optional argument WIDEN is non-nil, cancel narrowing
+and leave all lines accessible.
+
Prior to moving point, this function sets the mark (without
activating it), unless Transient Mark mode is enabled and the
mark is already active.
@@ -1252,32 +1289,7 @@ goto-line
If at all possible, an even better solution is to use char counts
rather than line counts."
(declare (interactive-only forward-line))
- (interactive
- (if (and current-prefix-arg (not (consp current-prefix-arg)))
- (list (prefix-numeric-value current-prefix-arg))
- ;; Look for a default, a number in the buffer at point.
- (let* ((default
- (save-excursion
- (skip-chars-backward "0-9")
- (if (looking-at "[0-9]")
- (string-to-number
- (buffer-substring-no-properties
- (point)
- (progn (skip-chars-forward "0-9")
- (point)))))))
- ;; Decide if we're switching buffers.
- (buffer
- (if (consp current-prefix-arg)
- (other-buffer (current-buffer) t)))
- (buffer-prompt
- (if buffer
- (concat " in " (buffer-name buffer))
- "")))
- ;; Read the argument, offering that number (if any) as default.
- (list (read-number (format "Goto line%s: " buffer-prompt)
- (list default (line-number-at-pos))
- 'goto-line-history)
- buffer))))
+ (interactive (goto-line-read-args))
;; Switch to the desired buffer, one way or another.
(if buffer
(let ((window (get-buffer-window buffer)))
@@ -1286,12 +1298,28 @@ goto-line
;; Leave mark at previous position
(or (region-active-p) (push-mark))
;; Move to the specified line number in that buffer.
- (save-restriction
- (widen)
- (goto-char (point-min))
- (if (eq selective-display t)
- (re-search-forward "[\n\C-m]" nil 'end (1- line))
- (forward-line (1- line)))))
+ (if (and (not relative) (not widen))
+ ;; Useless case because it just moves point to the edge of visible
portion.
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (if (eq selective-display t)
+ (re-search-forward "[\n\C-m]" nil 'end (1- line))
+ (forward-line (1- line))))
+ (progn
+ (unless relative (widen))
+ (goto-char (point-min))
+ (if (eq selective-display t)
+ (re-search-forward "[\n\C-m]" nil 'end (1- line))
+ (forward-line (1- line))))))
+
+(defun goto-line-absolute (line &optional buffer)
+ (interactive (goto-line-read-args))
+ (goto-line line buffer nil t))
+
+(defun goto-line-relative (line &optional buffer)
+ (interactive (goto-line-read-args t))
+ (goto-line line buffer t t))
(defun count-words-region (start end &optional arg)
"Count the number of words in the region.
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, (continued)
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Drew Adams, 2020/09/19
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Eli Zaretskii, 2020/09/19
- bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Drew Adams, 2020/09/19
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Eli Zaretskii, 2020/09/19
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Drew Adams, 2020/09/19
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Eli Zaretskii, 2020/09/20
bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Eli Zaretskii, 2020/09/19
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Lars Ingebrigtsen, 2020/09/20
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Juri Linkov, 2020/09/21
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Lars Ingebrigtsen, 2020/09/22
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer,
Juri Linkov <=
- bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Drew Adams, 2020/09/22
- bug#5042: bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Eli Zaretskii, 2020/09/23
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Drew Adams, 2020/09/23
- bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Juri Linkov, 2020/09/23
bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Lars Ingebrigtsen, 2020/09/23
bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Drew Adams, 2020/09/23
bug#9917: bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Robert Pluim, 2020/09/24
bug#5042: bug#9917: 24.0.90; Make `goto-line' consistent with the line number from the minibuffer, Drew Adams, 2020/09/24