# HG changeset patch # User Chong Yidong # Date 1249006483 0 # Node ID cfca1c9b77e2f1c00633121782ff4421a51dbcb4 # Parent 97987e968cf829ee8747474904ea1410edfb8d38 * simple.el (line-move-visual): Perform hscroll to the recorded position. diff -r 97987e968cf8 -r cfca1c9b77e2 lisp/ChangeLog --- 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 diff -r 97987e968cf8 -r cfca1c9b77e2 lisp/simple.el --- 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)