changeset 72411:b11613448626

(move-beginning-of-line): Test whether fields would prevent motion back to line's first visible character. If so, stop where the fields would stop the motion.
author Richard M. Stallman <rms@gnu.org>
date Wed, 16 Aug 2006 05:07:22 +0000
parents f945b59b4f03
children ec8109b4dd1d
files lisp/simple.el
diffstat 1 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/simple.el	Wed Aug 16 05:05:56 2006 +0000
+++ b/lisp/simple.el	Wed Aug 16 05:07:22 2006 +0000
@@ -3770,7 +3770,8 @@
   (interactive "p")
   (or arg (setq arg 1))
 
-  (let ((orig (point)))
+  (let ((orig (point))
+	start first-vis first-vis-field-value)
 
     ;; Move by lines, if ARG is not 1 (the default).
     (if (/= arg 1)
@@ -3781,10 +3782,24 @@
     (while (and (not (bobp)) (line-move-invisible-p (1- (point))))
       (goto-char (previous-char-property-change (point)))
       (skip-chars-backward "^\n"))
-
-    ;; Take care of fields.
-    (goto-char (constrain-to-field (point) orig
-				   (/= arg 1) t nil))))
+    (setq start (point))
+
+    ;; Now find first visible char in the line
+    (while (and (not (eobp)) (line-move-invisible-p (point)))
+      (goto-char (next-char-property-change (point))))
+    (setq first-vis (point))
+
+    ;; See if fields would stop us from reaching FIRST-VIS.
+    (setq first-vis-field-value
+	  (constrain-to-field first-vis orig (/= arg 1) t nil))
+
+    (goto-char (if (/= first-vis-field-value first-vis)
+		   ;; If yes, obey them.
+		   first-vis-field-value
+		 ;; Otherwise, move to START with attention to fields.
+		 ;; (It is possible that fields never matter in this case.)
+		 (constrain-to-field (point) orig
+				     (/= arg 1) t nil)))))
 
 
 ;;; Many people have said they rarely use this feature, and often type