unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Juri Linkov <juri@jurta.org>
Cc: emacs-devel@gnu.org
Subject: Re: isearch hooks
Date: Sat, 19 Jun 2004 21:36:18 +0300	[thread overview]
Message-ID: <87smcro0nx.fsf@mail.jurta.org> (raw)
In-Reply-To: <E1BbWOC-0001Gx-NA@fencepost.gnu.org> (Richard Stallman's message of "Fri, 18 Jun 2004 23:19:32 -0400")

Richard Stallman <rms@gnu.org> writes:
>     The patch below adds two hooks `isearch-wrapped-hook' and
>     `isearch-failed-hook'.
>
> Thanks for working on it.
>
> However, I have a feeling that `isearch-failed-hook' is not
> implemented properly for the intended use.  If isearch should move
> between info nodes, the natural way is that a failing search should
> switch nodes and then try again.  To do that, this hook should run
> shortly after the actual search primitive, and it should be run with
> run-hook-with-args-until-success, and if it succeeds then
> isearch-success should be t--as if the search primitive had succeeded.
> So it won't put "Failed " in the echo area, for instance.

This seems to be the right place to call the hook.

> I just looked at isearch.el and came across isearch-search-fun-function.
> I have a feeling that the right way to make isearch search through
> multiple nodes or buffers is to define a new low-level search function
> and interface it through isearch-search-fun-function.
>
> Does that look right to you?

It doesn't look right since `isearch-search-fun' is used to specify
the function to call for the search different from the default
`search-forward' or `re-search-forward'.  But in the intended cases
default functions are suitable to search the text in the buffer.
What is needed is to switch locations on the search when the search
in the current buffers is failed.

In the newest version I added a new variable `isearch-wrap-failed'.
If it is set to non-nil the search will not pause for displaying the
message "Failing I-search..." but will immediately wrap the search
to the location found by `isearch-wrap-functions'.

If `isearch-wrap-failed' is nil and `isearch-wrap-functions' are
specified, these hooks are called in another place, where currently
the point is moved to the beginning/end of the buffer.

And below is the hook which works for moving between Info nodes.
It sets isearch-cmds to nil, because it's impossible to restore
previous positions in visited Info nodes by typing DEL in isearch mode.

If it is ok, it could be added to info.el to be activated by some option
or minor mode.

(add-hook 'isearch-wrap-functions
          (lambda ()
            (Info-search isearch-string (unless isearch-forward 'backward))
            (goto-char (if isearch-forward (point-min) (point-max)))
            (setq isearch-cmds nil)
            t)
          nil t)

(set (make-local-variable 'isearch-wrap-failed) t)

There is also the patch to info.el below after isearch.el
which implements a backward search in Info mode.

Index: lisp/isearch.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/isearch.el,v
retrieving revision 1.228
diff -u -r1.228 isearch.el
--- lisp/isearch.el	6 Jun 2004 13:57:39 -0000	1.228
+++ lisp/isearch.el	19 Jun 2004 18:02:39 -0000
@@ -199,6 +157,14 @@
 (defvar isearch-mode-end-hook nil
   "Function(s) to call after terminating an incremental search.")
 
+(defvar isearch-wrap-functions nil
+  "Function(s) to call to wrap the search when search is failed.
+If nil, move point to the beginning of the buffer for a forward search,
+or to the end of the buffer for a backward search.")
+
+(defvar isearch-wrap-failed nil
+  "If non-nil, search is wrapped immediately after failing.")
+
 ;; Search ring.
 
 (defvar search-ring nil
@@ -990,8 +967,12 @@
 	;; If already have what to search for, repeat it.
 	(or isearch-success
 	    (progn
-	      (goto-char (if isearch-forward (point-min) (point-max)))
-	      (setq isearch-wrapped t))))
+             ;; `isearch-search' takes care of the following condition
+	      (when (not (and isearch-wrap-functions isearch-wrap-failed))
+                (if isearch-wrap-functions
+                    (run-hook-with-args-until-success 'isearch-wrap-functions)
+                  (goto-char (if isearch-forward (point-min) (point-max))))
+                (setq isearch-wrapped t)))))
     ;; C-s in reverse or C-r in forward, change direction.
     (setq isearch-forward (not isearch-forward)))
 
@@ -1786,6 +1885,7 @@
   (or isearch-success (setq ellipsis nil))
   (let ((m (concat (if isearch-success "" "failing ")
 		   (if (and isearch-wrapped
+			    (not isearch-wrap-functions)
 			    (if isearch-forward
 				(> (point) isearch-opoint)
 			      (< (point) isearch-opoint)))
@@ -1836,7 +1939,8 @@
       (let ((inhibit-point-motion-hooks search-invisible)
 	    (inhibit-quit nil)
 	    (case-fold-search isearch-case-fold-search)
-	    (retry t))
+	    (retry t)
+	    (m nil))
 	(if isearch-regexp (setq isearch-invalid-regexp nil))
 	(setq isearch-within-brackets nil)
 	(while retry
@@ -1852,7 +1956,15 @@
 		  (= (match-beginning 0) (match-end 0))
 		  (not (isearch-range-invisible
 			(match-beginning 0) (match-end 0))))
-	      (setq retry nil)))
+	      (setq retry nil))
+          (if (and isearch-wrap-failed isearch-wrap-functions
+		   (not isearch-success)
+		   (not (and (markerp m)
+			     (eq (marker-buffer m) (current-buffer))
+			     (eq (marker-position m) (point))))
+		   (run-hook-with-args-until-success
+		    'isearch-wrap-functions))
+	      (setq retry t m (point-marker) isearch-wrapped t)))
 	(setq isearch-just-started nil)
 	(if isearch-success
 	    (setq isearch-other-end
@@ -1878,7 +1990,8 @@
     ;; Ding if failed this time after succeeding last time.
     (and (nth 3 (car isearch-cmds))
 	 (ding))
-    (goto-char (nth 2 (car isearch-cmds)))))
+    (and (nth 2 (car isearch-cmds))
+	 (goto-char (nth 2 (car isearch-cmds))))))
 
 
 ;; Called when opening an overlay, and we are still in isearch.

Index: lisp/info.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/info.el,v
retrieving revision 1.398
diff -u -r1.398 info.el
--- lisp/info.el	12 Jun 2004 05:54:43 -0000	1.398
+++ lisp/info.el	19 Jun 2004 18:31:05 -0000
@@ -1442,8 +1442,9 @@
 (defvar Info-search-case-fold nil
   "The value of `case-fold-search' from previous `Info-search' command.")
 
-(defun Info-search (regexp)
-  "Search for REGEXP, starting from point, and select node it's found in."
+(defun Info-search (regexp &optional direction)
+  "Search for REGEXP, starting from point, and select node it's found in.
+If DIRECTION is `backward', search in the reverse direction."
   (interactive (list (read-string
 		      (if Info-search-history
 			  (format "Regexp search%s (default `%s'): "
@@ -1458,6 +1459,7 @@
     (setq regexp (car Info-search-history)))
   (when regexp
     (let (found beg-found give-up
+	  (backward (eq direction 'backward))
 	  (onode Info-current-node)
 	  (ofile Info-current-file)
 	  (opoint (point))
@@ -1472,14 +1474,21 @@
 	  (widen)
 	  (while (and (not give-up)
 		      (or (null found)
-			  (isearch-range-invisible beg-found found)))
-	    (if (re-search-forward regexp nil t)
-		(setq found (point) beg-found (match-beginning 0))
+			  (if backward
+                              (isearch-range-invisible found beg-found)
+                            (isearch-range-invisible beg-found found))))
+	    (if (if backward
+                    (re-search-backward regexp nil t)
+                  (re-search-forward regexp nil t))
+		(setq found (point) beg-found (if backward (match-end 0)
+                                                (match-beginning 0)))
 	      (setq give-up t)))))
       ;; If no subfiles, give error now.
       (if give-up
 	  (if (null Info-current-subfile)
-	      (re-search-forward regexp)
+	      (if backward
+                  (re-search-backward regexp)
+                (re-search-forward regexp))
 	    (setq found nil)))
 
       (unless found
@@ -1498,29 +1507,39 @@
 		  ;; Find the subfile we just searched.
 		  (search-forward (concat "\n" osubfile ": "))
 		  ;; Skip that one.
-		  (forward-line 1)
+		  (forward-line (if backward 0 1))
 		  ;; Make a list of all following subfiles.
 		  ;; Each elt has the form (VIRT-POSITION . SUBFILENAME).
-		  (while (not (eobp))
-		    (re-search-forward "\\(^.*\\): [0-9]+$")
+		  (while (not (if backward (bobp) (eobp)))
+		    (if backward
+		        (re-search-backward "\\(^.*\\): [0-9]+$")
+		      (re-search-forward "\\(^.*\\): [0-9]+$"))
 		    (goto-char (+ (match-end 1) 2))
 		    (setq list (cons (cons (+ (point-min)
 					      (read (current-buffer)))
 					   (match-string-no-properties 1))
 				     list))
-		    (goto-char (1+ (match-end 0))))
+		    (goto-char (if backward
+                                   (1- (match-beginning 0))
+                                 (1+ (match-end 0)))))
 		  ;; Put in forward order
 		  (setq list (nreverse list))))
 	      (while list
 		(message "Searching subfile %s..." (cdr (car list)))
 		(Info-read-subfile (car (car list)))
+                (if backward (goto-char (point-max)))
 		(setq list (cdr list))
 		(setq give-up nil found nil)
 		(while (and (not give-up)
 			    (or (null found)
-				(isearch-range-invisible beg-found found)))
-		  (if (re-search-forward regexp nil t)
-		      (setq found (point) beg-found (match-beginning 0))
+				(if backward
+                                    (isearch-range-invisible found beg-found)
+                                  (isearch-range-invisible beg-found found))))
+		  (if (if backward
+                          (re-search-backward regexp nil t)
+                        (re-search-forward regexp nil t))
+		      (setq found (point) beg-found (if backward (match-end 0)
+                                                      (match-beginning 0)))
 		    (setq give-up t)))
 		(if give-up
 		    (setq found nil))
@@ -1556,6 +1575,19 @@
     (if Info-search-history
         (Info-search (car Info-search-history))
       (call-interactively 'Info-search))))
+
+(defun Info-search-backward (regexp)
+  "Search for REGEXP in the reverse direction."
+  (interactive (list (read-string
+		      (if Info-search-history
+			  (format "Regexp search%s backward (default `%s'): "
+                                  (if case-fold-search "" " case-sensitively")
+				  (car Info-search-history))
+			(format "Regexp search%s backward: "
+                                (if case-fold-search "" " case-sensitively")))
+		      nil 'Info-search-history)))
+  (Info-search regexp 'backward))
+
 \f
 (defun Info-extract-pointer (name &optional errorname)
   "Extract the value of the node-pointer named NAME.

-- 
Juri Linkov
http://www.jurta.org/emacs/

  reply	other threads:[~2004-06-19 18:36 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-28 16:16 query-replace-interactive not documented Werner LEMBERG
2004-05-29 17:02 ` Richard Stallman
2004-05-29 17:37   ` Luc Teirlinck
2004-05-29 20:33     ` Juri Linkov
2004-06-11  8:19       ` Juri Linkov
2004-06-11  8:39         ` Kim F. Storm
2004-06-11  9:00         ` David Kastrup
2004-06-12  8:21           ` Juri Linkov
2004-06-12  1:50         ` Richard Stallman
2004-06-12  8:16           ` Juri Linkov
2004-06-13  0:01             ` Richard Stallman
2004-06-13  0:46               ` Miles Bader
2004-06-13  9:03               ` David Kastrup
2004-06-14 18:50                 ` Richard Stallman
2004-06-14 20:49                   ` Kim F. Storm
2004-06-14 21:20                     ` David Kastrup
2004-06-15 14:29                       ` Juri Linkov
2004-06-15 15:43                         ` David Kastrup
2004-06-15 18:17                           ` Juri Linkov
2004-06-15 20:23                             ` David Kastrup
2004-06-15 22:30                             ` Andreas Schwab
2004-06-15 22:36                               ` David Kastrup
2004-06-15 22:43                                 ` Kim F. Storm
2004-06-15 23:13                                   ` David Kastrup
2004-06-16  1:16                                     ` David Kastrup
2004-06-16  8:08                                       ` Juri Linkov
2004-06-16  9:23                                         ` David Kastrup
2004-06-16  8:02                                   ` Juri Linkov
2004-06-17  5:06                                   ` Richard Stallman
2004-06-16  8:17                               ` Juri Linkov
2004-06-16  9:01                                 ` David Kastrup
2004-06-16 17:06                                   ` Kevin Rodgers
2004-06-16  9:02                                 ` Andreas Schwab
2004-06-16  1:41                           ` Miles Bader
2004-06-16  2:01                             ` David Kastrup
2004-06-16  2:11                               ` Miles Bader
2004-06-16 16:57                           ` Richard Stallman
2004-06-15 22:25                         ` Andreas Schwab
2004-06-15 22:28                           ` Kim F. Storm
2004-06-16  9:00                             ` Juri Linkov
2004-06-16  9:25                               ` Andreas Schwab
2004-06-16  9:32                               ` David Kastrup
2004-06-16 11:30                                 ` Kim F. Storm
2004-06-16 12:15                                   ` David Kastrup
2004-06-16 14:35                                     ` David Kastrup
2004-06-16 15:23                                       ` Juri Linkov
2004-06-16 21:15                                         ` David Kastrup
2004-06-16 22:26                                           ` Kim F. Storm
2004-06-17  0:56                                             ` David Kastrup
2004-06-17 12:14                                               ` David Kastrup
2004-06-17 13:05                                                 ` Kim F. Storm
2004-06-17 13:29                                                   ` David Kastrup
2004-06-17 14:10                                                     ` Kim F. Storm
2004-06-17 14:56                                                 ` David Kastrup
2004-06-17 15:33                                                   ` Juri Linkov
2004-06-17 17:03                                                     ` David Kastrup
2004-06-18  6:43                                                       ` Juri Linkov
2004-06-18  7:13                                                         ` David Kastrup
2004-06-16 15:27                                       ` Kim F. Storm
2004-06-16 17:28                                       ` Juri Linkov
2004-06-16 21:07                                         ` David Kastrup
2004-06-17  0:47                                           ` David Kastrup
2004-06-17 23:05                                           ` Richard Stallman
2004-06-18  6:55                                             ` Juri Linkov
2004-06-19  3:19                                               ` Richard Stallman
2004-06-19  7:00                                                 ` David Kastrup
2004-06-20 19:18                                                   ` Richard Stallman
2004-06-20 21:05                                                     ` David Kastrup
2004-06-21  9:31                                                       ` Richard Stallman
2004-06-21  9:50                                                         ` David Kastrup
2004-06-22 23:16                                                           ` Richard Stallman
2004-06-25 23:12                                                         ` Juri Linkov
2004-06-26  7:34                                                           ` David Kastrup
2004-06-26 16:18                                                             ` Juri Linkov
2004-06-27 17:41                                                           ` Richard Stallman
2004-06-21  9:31                                                       ` Richard Stallman
2004-06-21  9:38                                                         ` David Kastrup
2004-06-22 23:17                                                           ` Richard Stallman
2004-06-22 23:20                                                             ` David Kastrup
2004-06-17  5:07                                 ` Richard Stallman
2004-06-14 16:59               ` Juri Linkov
2004-06-12  8:21           ` David Kastrup
2004-05-30 19:41     ` Richard Stallman
2004-05-30 22:00       ` Luc Teirlinck
2004-06-08  6:55       ` Juri Linkov
2004-06-11  8:22         ` Juri Linkov
2004-06-12  1:50           ` Richard Stallman
2004-06-18 20:00             ` isearch hooks (was: query-replace-interactive not documented) Juri Linkov
2004-06-19  1:10               ` Miles Bader
2004-06-19 18:09                 ` isearch hooks Juri Linkov
2004-06-19  3:19               ` isearch hooks (was: query-replace-interactive not documented) Richard Stallman
2004-06-19 18:36                 ` Juri Linkov [this message]
2004-06-20 19:18                   ` isearch hooks Richard Stallman
2004-06-21 21:56                     ` Juri Linkov
2004-06-22 23:17                       ` Richard Stallman
2004-06-25 18:07                         ` Juri Linkov
2004-06-27 17:41                           ` Richard Stallman
2004-06-27 22:34                             ` Juri Linkov
2004-06-28 14:57                               ` Richard Stallman
2004-06-29  0:25               ` isearch hooks (was: query-replace-interactive not documented) Stefan
2004-06-29  1:17                 ` isearch hooks Juri Linkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87smcro0nx.fsf@mail.jurta.org \
    --to=juri@jurta.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).