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

* bug#19824: 25.0.50; Support goal column in multi-line minibuffer
  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-03-12 20:27 ` Juri Linkov
  1 sibling, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2015-02-10 15:57 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 19824

> From: Juri Linkov <juri@linkov.net>
> Date: Tue, 10 Feb 2015 02:45:33 +0200
> 
> 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:

Thanks.

> -  (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)))))

Why do you use current-column and move-to-column here, instead of
using the line-move-visual methods we use by default in any other
buffer?  Is there some technical problem to use visual-line movement
in the minibuffer?  If not, I think we should do that for consistency
of the user experience.





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

* bug#19824: 25.0.50; Support goal column in multi-line minibuffer
  2015-02-10 15:57 ` Eli Zaretskii
@ 2015-02-10 23:38   ` Juri Linkov
  2015-02-11 15:39     ` Eli Zaretskii
  0 siblings, 1 reply; 6+ messages in thread
From: Juri Linkov @ 2015-02-10 23:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 19824

> Why do you use current-column and move-to-column here, instead of
> using the line-move-visual methods we use by default in any other
> buffer?  Is there some technical problem to use visual-line movement
> in the minibuffer?  If not, I think we should do that for consistency
> of the user experience.

line-move-visual is still used while moving point inside the minibuffer,
but when moving to another history element, the whole contents of the
minibuffer is erased, and new text is inserted, in which the column
should be positioned correctly.





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

* bug#19824: 25.0.50; Support goal column in multi-line minibuffer
  2015-02-10 23:38   ` Juri Linkov
@ 2015-02-11 15:39     ` Eli Zaretskii
  2015-02-12  0:54       ` Juri Linkov
  0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2015-02-11 15:39 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 19824

> From: Juri Linkov <juri@linkov.net>
> Cc: 19824@debbugs.gnu.org
> Date: Wed, 11 Feb 2015 01:38:03 +0200
> 
> > Why do you use current-column and move-to-column here, instead of
> > using the line-move-visual methods we use by default in any other
> > buffer?  Is there some technical problem to use visual-line movement
> > in the minibuffer?  If not, I think we should do that for consistency
> > of the user experience.
> 
> line-move-visual is still used while moving point inside the minibuffer,
> but when moving to another history element, the whole contents of the
> minibuffer is erased, and new text is inserted, in which the column
> should be positioned correctly.

Right, sorry.  So I guess now I don't understand why we try keeping
the horizontal position across history elements.  Why not reset the
position to just after the prompt?  There's nothing in common between
the history elements, in general.





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

* bug#19824: 25.0.50; Support goal column in multi-line minibuffer
  2015-02-11 15:39     ` Eli Zaretskii
@ 2015-02-12  0:54       ` Juri Linkov
  0 siblings, 0 replies; 6+ messages in thread
From: Juri Linkov @ 2015-02-12  0:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 19824

> Right, sorry.  So I guess now I don't understand why we try keeping
> the horizontal position across history elements.  Why not reset the
> position to just after the prompt?  There's nothing in common between
> the history elements, in general.

This is for backward-compatibility with the traditional behavior
that existed from the beginning that kept the horizontal position
for single-line history elements.  And it's really convenient
when the history is navigated the same way as a normal buffer
where line-move-visual keeps the column.





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

* bug#19824: 25.0.50; Support goal column in multi-line minibuffer
  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-03-12 20:27 ` Juri Linkov
  1 sibling, 0 replies; 6+ messages in thread
From: Juri Linkov @ 2015-03-12 20:27 UTC (permalink / raw)
  To: 19824-done

Done.





^ permalink raw reply	[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).