Subject: bug#22118: 23.2; Hitting ^W in a search selects the wrong word.

From: Juri Linkov <[email-masked]>
Date: Sat, 12 Dec 2015 00:54:47 +0200

> I would say, either update the text window too or disallow using ^W
> after a failure.

I agree that the current behavior is not ideal.  The problem is that
it's difficult to make it more intuitive to work with different
workflows such as when failing not at the end of the buffer
but due to a non-existent string, e.g. typing ‘zzz C-w C-w C-w’.
Please try this patch that takes into account such possible scenarios.

However, I don't agree this is a bug, I think it just provides a more
useful behavior, so perhaps it shouldn't be installed to emacs-25.

diff --git a/lisp/isearch.el b/lisp/isearch.el
index 66fab0e..e9a99ea 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -1959,6 +1959,8 @@ (defun isearch-mouse-2 (click)
       (when (functionp binding)
 	(call-interactively binding)))))
 
+(defvar isearch-yank-prev-point nil)
+
 (defun isearch-yank-internal (jumpform)
   "Pull the text from point to the point reached by JUMPFORM.
 JUMPFORM is a lambda expression that takes no arguments and returns
@@ -1969,7 +1971,14 @@ (defun isearch-yank-internal (jumpform)
    (save-excursion
      (and (not isearch-forward) isearch-other-end
 	  (goto-char isearch-other-end))
-     (buffer-substring-no-properties (point) (funcall jumpform)))))
+     (and (not isearch-success) isearch-yank-prev-point
+	  (goto-char isearch-yank-prev-point))
+     (buffer-substring-no-properties
+      (point)
+      (prog1
+	  (setq isearch-yank-prev-point (funcall jumpform))
+	(when isearch-success
+	  (setq isearch-yank-prev-point nil)))))))
 
 (defun isearch-yank-char-in-minibuffer (&optional arg)
   "Pull next character from buffer into end of search string in minibuffer."