changeset 106478:1d70a4746fc4

Correctly restore original Isearch point. (Bug#4994) * isearch.el (isearch-mode): Move `isearch-push-state' after `(run-hooks 'isearch-mode-hook)'. (isearch-cancel): When `isearch-push-state-function' is defined, let-bind `isearch-cmds' to the first state (the last element of `isearch-cmds') and call `isearch-top-state' (it calls pop-state function and restores the original point). Otherwise, move point to `isearch-opoint'.
author Juri Linkov <juri@jurta.org>
date Mon, 07 Dec 2009 17:30:01 +0000
parents 51b191bf2e2e
children 67d8bc783433
files lisp/ChangeLog lisp/isearch.el
diffstat 2 files changed, 24 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Mon Dec 07 16:53:48 2009 +0000
+++ b/lisp/ChangeLog	Mon Dec 07 17:30:01 2009 +0000
@@ -1,3 +1,15 @@
+2009-12-07  Juri Linkov  <juri@jurta.org>
+
+	Correctly restore original Isearch point.  (Bug#4994)
+
+	* isearch.el (isearch-mode): Move `isearch-push-state' after
+	`(run-hooks 'isearch-mode-hook)'.
+	(isearch-cancel): When `isearch-push-state-function' is defined,
+	let-bind `isearch-cmds' to the first state (the last element of
+	`isearch-cmds') and call `isearch-top-state' (it calls pop-state
+	function and restores the original point).  Otherwise, move point
+	to `isearch-opoint'.
+
 2009-12-07  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* international/mule-cmds.el (ucs-names): Weed out at compile-time the
--- a/lisp/isearch.el	Mon Dec 07 16:53:48 2009 +0000
+++ b/lisp/isearch.el	Mon Dec 07 17:30:01 2009 +0000
@@ -798,10 +798,14 @@
   (setq	isearch-mode " Isearch")  ;; forward? regexp?
   (force-mode-line-update)
 
+  (setq overriding-terminal-local-map isearch-mode-map)
+  (run-hooks 'isearch-mode-hook)
+
+  ;; Pushing the initial state used to be before running isearch-mode-hook,
+  ;; but a hook might set `isearch-push-state-function' used in
+  ;; `isearch-push-state' to save mode-specific initial state.  (Bug#4994)
   (isearch-push-state)
 
-  (setq overriding-terminal-local-map isearch-mode-map)
-  (run-hooks 'isearch-mode-hook)
   (isearch-update)
 
   (add-hook 'mouse-leave-buffer-hook 'isearch-done)
@@ -1212,10 +1216,12 @@
 (defun isearch-cancel ()
   "Terminate the search and go back to the starting point."
   (interactive)
-  (if (functionp (isearch-pop-fun-state (car (last isearch-cmds))))
-      (funcall (isearch-pop-fun-state (car (last isearch-cmds)))
-               (car (last isearch-cmds))))
-  (goto-char isearch-opoint)
+  (if (and isearch-push-state-function isearch-cmds)
+      ;; For defined push-state function, restore the first state.
+      ;; This calls pop-state function and restores original point.
+      (let ((isearch-cmds (last isearch-cmds)))
+	(isearch-top-state))
+    (goto-char isearch-opoint))
   (isearch-done t)                      ; exit isearch
   (isearch-clean-overlays)
   (signal 'quit nil))                   ; and pass on quit signal