Mercurial > emacs
changeset 103862:b760b8569489
* simple.el (temporary-goal-column): Change the value for
line-move-visual to a cons cell.
(line-move-visual): Record or set the window hscroll, if
necessary (Bug#3494).
(line-move-1): Handle cons value of temporary-goal-column.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Sat, 11 Jul 2009 16:36:05 +0000 |
parents | 2359749268a7 |
children | 79feb82d15fb |
files | lisp/ChangeLog lisp/simple.el |
diffstat | 2 files changed, 43 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Sat Jul 11 15:45:45 2009 +0000 +++ b/lisp/ChangeLog Sat Jul 11 16:36:05 2009 +0000 @@ -1,3 +1,11 @@ +2009-07-11 Chong Yidong <cyd@stupidchicken.com> + + * simple.el (temporary-goal-column): Change the value for + line-move-visual to a cons cell. + (line-move-visual): Record or set the window hscroll, if + necessary (Bug#3494). + (line-move-1): Handle cons value of temporary-goal-column. + 2009-07-11 Kenichi Handa <handa@m17n.org> * international/mule-diag.el (describe-character-set): Don't show
--- a/lisp/simple.el Sat Jul 11 15:45:45 2009 +0000 +++ b/lisp/simple.el Sat Jul 11 16:36:05 2009 +0000 @@ -3973,10 +3973,14 @@ (defvar temporary-goal-column 0 "Current goal column for vertical motion. It is the column where point was at the start of the current run -of vertical motion commands. It is a floating point number when -moving by visual lines via `line-move-visual'; this is the -x-position, in pixels, divided by the default column width. When -the `track-eol' feature is doing its job, the value is +of vertical motion commands. + +When moving by visual lines via `line-move-visual', it is a cons +cell (COL . HSCROLL), where COL is the x-position, in pixels, +divided by the default column width, and HSCROLL is the number of +columns by which window is scrolled from left margin. + +When the `track-eol' feature is doing its job, the value is `most-positive-fixnum'.") (defcustom line-move-ignore-invisible t @@ -4075,18 +4079,33 @@ (defun line-move-visual (arg &optional noerror) (let ((posn (posn-at-point)) (opoint (point)) + (hscroll (window-hscroll)) x) - ;; Reset temporary-goal-column, unless the previous command was a - ;; line-motion command or we were called from some other command. - (unless (and (floatp temporary-goal-column) - (memq last-command `(next-line previous-line ,this-command))) - (cond ((eq (nth 1 posn) 'right-fringe) ; overflow-newline-into-fringe - (setq temporary-goal-column (- (window-width) 1))) - ((setq x (car (posn-x-y posn))) - (setq temporary-goal-column (/ (float x) (frame-char-width)))))) + ;; 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'. (or (and (= (vertical-motion - (cons (or goal-column (truncate temporary-goal-column)) arg)) + (cons (or goal-column + (if (consp temporary-goal-column) + (truncate (car temporary-goal-column)) + temporary-goal-column)) + arg)) arg) (or (>= arg 0) (/= (point) opoint) @@ -4108,8 +4127,9 @@ (let ((inhibit-point-motion-hooks t) (opoint (point)) (orig-arg arg)) - (if (floatp temporary-goal-column) - (setq temporary-goal-column (truncate temporary-goal-column))) + (if (consp temporary-goal-column) + (setq temporary-goal-column (+ (car temporary-goal-column) + (cdr temporary-goal-column)))) (unwind-protect (progn (if (not (memq last-command '(next-line previous-line)))