unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#19824: 25.0.50; Support goal column in multi-line minibuffer
@ 2015-02-10  0:45 Juri Linkov
  2015-02-10 15:57 ` Eli Zaretskii
  2015-03-12 20:27 ` Juri Linkov
  0 siblings, 2 replies; 6+ messages in thread
From: Juri Linkov @ 2015-02-10  0:45 UTC (permalink / raw)
  To: 19824

Tags: patch

In the single-line minibuffer the goal column was handled by using the point's
absolute position that is the same as the column on the single line.
However, this doesn't work on the multi-line minibuffer.  This patch adds
support for the goal column on multi-line input in the minibuffer:

diff --git a/lisp/simple.el b/lisp/simple.el
index 25293ed..58b4870 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -1990,7 +1990,14 @@ (defun next-line-or-history-element (&optional arg)
 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))
@@ -1998,7 +2005,14 @@ (defun next-line-or-history-element (&optional arg)
        ;; 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.
@@ -2006,7 +2020,14 @@ (defun previous-line-or-history-element (&optional arg)
 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))
@@ -2014,7 +2035,15 @@ (defun previous-line-or-history-element (&optional arg)
        ;; 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.





^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-03-12 20:27 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-10  0:45 bug#19824: 25.0.50; Support goal column in multi-line minibuffer Juri Linkov
2015-02-10 15:57 ` Eli Zaretskii
2015-02-10 23:38   ` Juri Linkov
2015-02-11 15:39     ` Eli Zaretskii
2015-02-12  0:54       ` Juri Linkov
2015-03-12 20:27 ` Juri Linkov

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).