changeset 32897:99da951a3b7f

(previous-matching-history-element): Position point on match. Handle N == 0 correctly. Miscellaneous cleanup.
author Miles Bader <miles@gnu.org>
date Thu, 26 Oct 2000 04:33:53 +0000
parents 3d8fb019040f
children 3eba63072790
files lisp/simple.el
diffstat 1 files changed, 39 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/simple.el	Thu Oct 26 01:22:29 2000 +0000
+++ b/lisp/simple.el	Thu Oct 26 04:33:53 2000 +0000
@@ -715,44 +715,49 @@
 		 (error "No previous history search regexp"))
 	     regexp)
 	   (prefix-numeric-value current-prefix-arg))))
-  (if (and (zerop minibuffer-history-position)
-	   (null minibuffer-text-before-history))
-      (setq minibuffer-text-before-history (field-string (point-max))))
-  (let ((history (symbol-value minibuffer-history-variable))
-	(case-fold-search
-	 (if (isearch-no-upper-case-p regexp t)	; assume isearch.el is dumped
-	     ;; On some systems, ignore case for file names.
-	     (if (memq minibuffer-history-variable
-		       minibuffer-history-case-insensitive-variables)
-		 t
-	       ;; Respect the user's setting for case-fold-search:
-	       case-fold-search)
-	   nil))
-	prevpos
-	(pos minibuffer-history-position))
-    (while (/= n 0)
-      (setq prevpos pos)
-      (setq pos (min (max 1 (+ pos (if (< n 0) -1 1))) (length history)))
-      (if (= pos prevpos)
+  (unless (zerop n)
+    (if (and (zerop minibuffer-history-position)
+	     (null minibuffer-text-before-history))
+	(setq minibuffer-text-before-history (field-string (point-max))))
+    (let ((history (symbol-value minibuffer-history-variable))
+	  (case-fold-search
+	   (if (isearch-no-upper-case-p regexp t) ; assume isearch.el is dumped
+	       ;; On some systems, ignore case for file names.
+	       (if (memq minibuffer-history-variable
+			 minibuffer-history-case-insensitive-variables)
+		   t
+		 ;; Respect the user's setting for case-fold-search:
+		 case-fold-search)
+	     nil))
+	  prevpos
+	  match-string
+	  match-offset
+	  (pos minibuffer-history-position))
+      (while (/= n 0)
+	(setq prevpos pos)
+	(setq pos (min (max 1 (+ pos (if (< n 0) -1 1))) (length history)))
+	(when (= pos prevpos)
 	  (error (if (= pos 1)
 		     "No later matching history item"
 		   "No earlier matching history item")))
-      (if (string-match regexp
-			(if (eq minibuffer-history-sexp-flag
-				(minibuffer-depth))
-			    (let ((print-level nil))
-			      (prin1-to-string (nth (1- pos) history)))
-			  (nth (1- pos) history)))
+	(setq match-string
+	      (if (eq minibuffer-history-sexp-flag (minibuffer-depth))
+		  (let ((print-level nil))
+		    (prin1-to-string (nth (1- pos) history)))
+		(nth (1- pos) history)))
+	(setq match-offset
+	      (if (< n 0)
+		  (and (string-match regexp match-string)
+		       (match-end 0))
+		(and (string-match (concat ".*\\(" regexp "\\)") match-string)
+		     (match-beginning 1))))
+	(when match-offset
 	  (setq n (+ n (if (< n 0) 1 -1)))))
-    (setq minibuffer-history-position pos)
-    (goto-char (point-max))
-    (delete-field)
-    (let ((elt (nth (1- pos) history)))
-      (insert (if (eq minibuffer-history-sexp-flag (minibuffer-depth))
-		  (let ((print-level nil))
-		    (prin1-to-string elt))
-		elt)))
-      (goto-char (field-beginning)))
+      (setq minibuffer-history-position pos)
+      (goto-char (point-max))
+      (delete-field)
+      (insert match-string)
+      (goto-char (+ (field-beginning) match-offset))))
   (if (or (eq (car (car command-history)) 'previous-matching-history-element)
 	  (eq (car (car command-history)) 'next-matching-history-element))
       (setq command-history (cdr command-history))))