From 624a662f9acc017f0fc74fc4b98eb7cb8e73c165 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sat, 25 Apr 2009 15:27:45 +0000 Subject: [PATCH] * simple.el (line-move-visual): If point is stuck moving backwards against a display string, temporarily ignore the goal column (Bug#3020). --- lisp/ChangeLog | 4 ++++ lisp/simple.el | 39 +++++++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d8ed4e20181..e77abd01379 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,9 @@ 2009-04-25 Chong Yidong + * simple.el (line-move-visual): If point is stuck moving backwards + against a display string, temporarily ignore the goal + column (Bug#3020). + * startup.el (normal-top-level): Implement a work-around to handle changes to face-font-rescale-alist during initialization (Bug#1785). diff --git a/lisp/simple.el b/lisp/simple.el index fd281429032..082605f659d 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -4056,24 +4056,31 @@ into account variable-width characters and line continuation." ;; 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) - (unless (and (floatp temporary-goal-column) - (or (memq last-command '(next-line previous-line)) - ;; In case we're called from some other command. - (eq last-command this-command))) - (let ((posn (posn-at-point)) - x) + (let ((posn (posn-at-point)) + (opoint (point)) + 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 (nth 2 posn))) - (setq temporary-goal-column (/ (float x) (frame-char-width))))))) - (or (= (vertical-motion - (cons (or goal-column (truncate temporary-goal-column)) arg)) - arg) - (unless noerror - (signal (if (< arg 0) - 'beginning-of-buffer - 'end-of-buffer) - nil)))) + ((setq x (car (posn-x-y posn))) + (setq temporary-goal-column (/ (float x) (frame-char-width)))))) + ;; Move using `vertical-motion'. + (or (and (= (vertical-motion + (cons (or goal-column (truncate temporary-goal-column)) arg)) + arg) + (or (>= arg 0) + (/= (point) opoint) + ;; If the goal column lies on a display string, + ;; `vertical-motion' advances the cursor to the end + ;; of the string. For arg < 0, this can cause the + ;; cursor to get stuck. (Bug#3020). + (= (vertical-motion arg) arg))) + (unless noerror + (signal (if (< arg 0) 'beginning-of-buffer 'end-of-buffer) + nil))))) ;; This is the guts of next-line and previous-line. ;; Arg says how many lines to move. -- 2.39.2