changeset 82039:ee17cf620665

(isearch-edit-string): Save old point and isearch-other-end to old-point and old-other-end before reading the search string from minibuffer. After exiting minibuffer set point to old-other-end if point and the search direction is the same as before reading the search string. (isearch-del-char): Don't set isearch-yank-flag to t. Put point to isearch-other-end. Instead of isearch-search-and-update call three functions isearch-search, isearch-push-state and isearch-update.
author Juri Linkov <juri@jurta.org>
date Sun, 22 Jul 2007 22:33:08 +0000
parents 7ee8cfeeb2b8
children da93af05594f
files lisp/isearch.el
diffstat 1 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/isearch.el	Sun Jul 22 22:03:27 2007 +0000
+++ b/lisp/isearch.el	Sun Jul 22 22:33:08 2007 +0000
@@ -992,7 +992,7 @@
 	       isearch-original-minibuffer-message-timeout)
 	      (isearch-original-minibuffer-message-timeout
 	       isearch-original-minibuffer-message-timeout)
-	      )
+	      old-point old-other-end)
 
 	  ;; Actually terminate isearching until editing is done.
 	  ;; This is so that the user can do anything without failure,
@@ -1001,6 +1001,10 @@
 	      (isearch-done t t)
 	    (exit nil))			; was recursive editing
 
+	  ;; Save old point and isearch-other-end before reading from minibuffer
+	  ;; that can change their values.
+	  (setq old-point (point) old-other-end isearch-other-end)
+
 	  (isearch-message) ;; for read-char
 	  (unwind-protect
 	      (let* (;; Why does following read-char echo?
@@ -1036,6 +1040,14 @@
 		      isearch-new-message
 		      (mapconcat 'isearch-text-char-description
 				 isearch-new-string "")))
+
+	    ;; Set point at the start (end) of old match if forward (backward),
+	    ;; so after exiting minibuffer isearch resumes at the start (end)
+	    ;; of this match and can find it again.
+	    (if (and old-other-end (eq old-point (point))
+		     (eq isearch-forward isearch-new-forward))
+		(goto-char old-other-end))
+
 	    ;; Always resume isearching by restarting it.
 	    (isearch-mode isearch-forward
 			  isearch-regexp
@@ -1260,10 +1272,13 @@
       (ding)
     (setq isearch-string (substring isearch-string 0 (- (or arg 1)))
           isearch-message (mapconcat 'isearch-text-char-description
-                                     isearch-string "")
-          ;; Don't move cursor in reverse search.
-          isearch-yank-flag t))
-  (isearch-search-and-update))
+                                     isearch-string "")))
+  ;; Use the isearch-other-end as new starting point to be able
+  ;; to find the remaining part of the search string again.
+  (if isearch-other-end (goto-char isearch-other-end))
+  (isearch-search)
+  (isearch-push-state)
+  (isearch-update))
 
 (defun isearch-yank-string (string)
   "Pull STRING into search string."