changeset 104117:cfca1c9b77e2

* simple.el (line-move-visual): Perform hscroll to the recorded position.
author Chong Yidong <cyd@stupidchicken.com>
date Fri, 31 Jul 2009 02:14:43 +0000
parents 97987e968cf8
children be3e01fa532e
files lisp/ChangeLog lisp/simple.el
diffstat 2 files changed, 22 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Jul 31 01:34:26 2009 +0000
+++ b/lisp/ChangeLog	Fri Jul 31 02:14:43 2009 +0000
@@ -2,6 +2,7 @@
 
 	* simple.el (line-move-finish): Pass whole number to
 	line-move-to-column.
+	(line-move-visual): Perform hscroll to the recorded position.
 
 2009-07-30  Jay Belanger  <jay.p.belanger@gmail.com>
 
--- a/lisp/simple.el	Fri Jul 31 01:34:26 2009 +0000
+++ b/lisp/simple.el	Fri Jul 31 02:14:43 2009 +0000
@@ -4092,29 +4092,30 @@
 ;; Arg says how many lines to move.  The value is t if we can move the
 ;; specified number of lines.
 (defun line-move-visual (arg &optional noerror)
-  (let ((posn (posn-at-point))
-	(opoint (point))
+  (let ((opoint (point))
 	(hscroll (window-hscroll))
-	x)
+	target-hscroll)
     ;; Check if the previous command was a line-motion command, or if
     ;; we were called from some other command.
-    (cond ((and (consp temporary-goal-column)
-		(memq last-command `(next-line previous-line ,this-command)))
-	   ;; If so, there's no need to reset `temporary-goal-column',
-	   ;; unless the window hscroll has changed.
-	   (when (/= hscroll (cdr temporary-goal-column))
-	     (set-window-hscroll nil 0)
-	     (setq temporary-goal-column
-		   (cons (+ (car temporary-goal-column)
-			    (cdr temporary-goal-column)) 0))))
-	  ;; Otherwise, we should reset `temporary-goal-column'.
-	  ;; Handle the `overflow-newline-into-fringe' case:
-	  ((eq (nth 1 posn) 'right-fringe)
-	   (setq temporary-goal-column (cons (- (window-width) 1) hscroll)))
-	  ((setq x (car (posn-x-y posn)))
-	   (setq temporary-goal-column
-		 (cons (/ (float x) (frame-char-width)) hscroll))))
-    ;; Move using `vertical-motion'.
+    (if (and (consp temporary-goal-column)
+	     (memq last-command `(next-line previous-line ,this-command)))
+	;; If so, there's no need to reset `temporary-goal-column',
+	;; but we may need to hscroll.
+	(if (or (/= (cdr temporary-goal-column) hscroll)
+		(>  (cdr temporary-goal-column) 0))
+	    (setq target-hscroll (cdr temporary-goal-column)))
+      ;; Otherwise, we should reset `temporary-goal-column'.
+      (let ((posn (posn-at-point)))
+	(cond
+	 ;; Handle the `overflow-newline-into-fringe' case:
+	 ((eq (nth 1 posn) 'right-fringe)
+	  (setq temporary-goal-column (cons (- (window-width) 1) hscroll)))
+	 ((car (posn-x-y posn))
+	  (setq temporary-goal-column
+		(cons (/ (float (car (posn-x-y posn)))
+			 (frame-char-width)) hscroll))))))
+    (if target-hscroll
+	(set-window-hscroll (selected-window) target-hscroll))
     (or (and (= (vertical-motion
 		 (cons (or goal-column
 			   (if (consp temporary-goal-column)