emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 3247c31d67: New function isearch-search-fun-in-text-property (bug


From: Juri Linkov
Subject: master 3247c31d67: New function isearch-search-fun-in-text-property (bug#14013).
Date: Fri, 10 Jun 2022 12:44:01 -0400 (EDT)

branch: master
commit 3247c31d672e5fed83435150ba62006acaddcf84
Author: Juri Linkov <juri@linkov.net>
Commit: Juri Linkov <juri@linkov.net>

    New function isearch-search-fun-in-text-property (bug#14013).
    
    * lisp/dired-aux.el (dired-isearch-search-filenames): Move most of the body
    to the new function isearch-search-fun-in-text-property.
    
    * lisp/isearch.el (isearch-search-fun-in-text-property):
    New function refactored from dired-isearch-search-filenames.
---
 lisp/dired-aux.el | 36 +-----------------------------------
 lisp/isearch.el   | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 35 deletions(-)

diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 4faf9431aa..d16aee0fa8 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -3208,41 +3208,7 @@ Intended to be added to `isearch-mode-hook'."
 The returned function narrows the search to match the search string
 only as part of a file name enclosed by the text property `dired-filename'.
 It's intended to override the default search function."
-  (let ((search-fun (funcall orig-fun))
-        (property 'dired-filename))
-    (lambda (string &optional bound noerror count)
-      (let* ((old (point))
-             ;; Check if point is already on the property.
-             (beg (when (get-text-property
-                         (if isearch-forward old (max (1- old) (point-min)))
-                         property)
-                    old))
-             end found)
-        ;; Otherwise, try to search for the next property.
-        (unless beg
-          (setq beg (if isearch-forward
-                        (next-single-property-change old property)
-                      (previous-single-property-change old property)))
-          (when beg (goto-char beg)))
-        ;; Non-nil `beg' means there are more properties.
-        (while (and beg (not found))
-          ;; Search for the end of the current property.
-          (setq end (if isearch-forward
-                        (next-single-property-change beg property)
-                      (previous-single-property-change beg property)))
-          (setq found (funcall
-                       search-fun string (if bound (if isearch-forward
-                                                       (min bound end)
-                                                     (max bound end))
-                                           end)
-                       noerror count))
-          (unless found
-            (setq beg (if isearch-forward
-                          (next-single-property-change end property)
-                        (previous-single-property-change end property)))
-            (when beg (goto-char beg))))
-        (unless found (goto-char old))
-        found))))
+  (isearch-search-fun-in-text-property 'dired-filename (funcall orig-fun)))
 
 ;;;###autoload
 (defun dired-isearch-filenames ()
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 31fbdf01bf..5fbfb724a3 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -4455,6 +4455,48 @@ LAX-WHITESPACE: The value of `isearch-lax-whitespace' and
         (funcall after-change nil nil nil)))))
 
 
+(defun isearch-search-fun-in-text-property (property &optional search-fun)
+  "Return the function that searches inside fields.
+The arg PROPERTY defines the name of the text property that
+delimits fields in the current buffer.  Then the search will be
+narrowed to match only on such text properties.  The optional arg
+SEARCH-FUN can provide the default search function which is
+by default is the same as returned by `isearch-search-fun-default'."
+  (lambda (string &optional bound noerror count)
+    (let* ((old (point))
+           ;; Check if point is already on the property.
+           (beg (when (get-text-property
+                       (if isearch-forward old (max (1- old) (point-min)))
+                       property)
+                  old))
+           end found)
+      ;; Otherwise, try to search for the next property.
+      (unless beg
+        (setq beg (if isearch-forward
+                      (next-single-property-change old property)
+                    (previous-single-property-change old property)))
+        (when beg (goto-char beg)))
+      ;; Non-nil `beg' means there are more properties.
+      (while (and beg (not found))
+        ;; Search for the end of the current property.
+        (setq end (if isearch-forward
+                      (next-single-property-change beg property)
+                    (previous-single-property-change beg property)))
+        (setq found (funcall (or search-fun (isearch-search-fun-default))
+                             string (if bound (if isearch-forward
+                                                  (min bound end)
+                                                (max bound end))
+                                      end)
+                             noerror count))
+        (unless found
+          (setq beg (if isearch-forward
+                        (next-single-property-change end property)
+                      (previous-single-property-change end property)))
+          (when beg (goto-char beg))))
+      (unless found (goto-char old))
+      found)))
+
+
 (defun isearch-resume (string regexp word forward message case-fold)
   "Resume an incremental search.
 STRING is the string or regexp searched for.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]