summaryrefslogtreecommitdiff
path: root/lisp/simple.el
diff options
context:
space:
mode:
authorJuri Linkov <juri@linkov.net>2015-03-12 22:22:22 +0200
committerJuri Linkov <juri@linkov.net>2015-03-12 22:22:22 +0200
commitb91eafe31a524b391d5cec079cf8f36c2f9d5f30 (patch)
tree13e11f67e0ed42519c1189d116dfa9181201ade7 /lisp/simple.el
parentac4cce624c4f51cbc57a210ade0ca74a1893d636 (diff)
downloademacs-b91eafe31a524b391d5cec079cf8f36c2f9d5f30.tar.gz
Support goal column in multi-line minibuffer
* lisp/simple.el (next-line-or-history-element) (previous-line-or-history-element): Remember the goal column of possibly multi-line input, and restore it afterwards. Fixes: debbugs:19824
Diffstat (limited to 'lisp/simple.el')
-rw-r--r--lisp/simple.el37
1 files changed, 33 insertions, 4 deletions
diff --git a/lisp/simple.el b/lisp/simple.el
index 4deb4cfce2e..98188a07b6f 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -1992,7 +1992,14 @@ When point moves over the bottom line of multi-line minibuffer, puts ARGth
next element of the minibuffer history in the minibuffer."
(interactive "^p")
(or arg (setq arg 1))
- (let ((old-point (point)))
+ (let* ((old-point (point))
+ ;; Remember the original goal column of possibly multi-line input
+ ;; excluding the length of the prompt on the first line.
+ (prompt-end (minibuffer-prompt-end))
+ (old-column (unless (and (eolp) (> (point) prompt-end))
+ (if (= (line-number-at-pos) 1)
+ (max (- (current-column) (1- prompt-end)) 0)
+ (current-column)))))
(condition-case nil
(with-no-warnings
(next-line arg))
@@ -2000,7 +2007,14 @@ next element of the minibuffer history in the minibuffer."
;; Restore old position since `line-move-visual' moves point to
;; the end of the line when it fails to go to the next line.
(goto-char old-point)
- (next-history-element arg)))))
+ (next-history-element arg)
+ ;; Restore the original goal column on the last line
+ ;; of possibly multi-line input.
+ (goto-char (point-max))
+ (when old-column
+ (if (= (line-number-at-pos) 1)
+ (move-to-column (+ old-column (1- (minibuffer-prompt-end))))
+ (move-to-column old-column)))))))
(defun previous-line-or-history-element (&optional arg)
"Move cursor vertically up ARG lines, or to the previous history element.
@@ -2008,7 +2022,14 @@ When point moves over the top line of multi-line minibuffer, puts ARGth
previous element of the minibuffer history in the minibuffer."
(interactive "^p")
(or arg (setq arg 1))
- (let ((old-point (point)))
+ (let* ((old-point (point))
+ ;; Remember the original goal column of possibly multi-line input
+ ;; excluding the length of the prompt on the first line.
+ (prompt-end (minibuffer-prompt-end))
+ (old-column (unless (and (eolp) (> (point) prompt-end))
+ (if (= (line-number-at-pos) 1)
+ (max (- (current-column) (1- prompt-end)) 0)
+ (current-column)))))
(condition-case nil
(with-no-warnings
(previous-line arg))
@@ -2016,7 +2037,15 @@ previous element of the minibuffer history in the minibuffer."
;; Restore old position since `line-move-visual' moves point to
;; the beginning of the line when it fails to go to the previous line.
(goto-char old-point)
- (previous-history-element arg)))))
+ (previous-history-element arg)
+ ;; Restore the original goal column on the first line
+ ;; of possibly multi-line input.
+ (goto-char (minibuffer-prompt-end))
+ (if old-column
+ (if (= (line-number-at-pos) 1)
+ (move-to-column (+ old-column (1- (minibuffer-prompt-end))))
+ (move-to-column old-column))
+ (goto-char (line-end-position)))))))
(defun next-complete-history-element (n)
"Get next history element which completes the minibuffer before the point.