From 3247c31d672e5fed83435150ba62006acaddcf84 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Fri, 10 Jun 2022 19:43:31 +0300 Subject: [PATCH] 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 4faf9431aa3..d16aee0fa86 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 31fbdf01bf2..5fbfb724a3c 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -4454,6 +4454,48 @@ LAX-WHITESPACE: The value of `isearch-lax-whitespace' and (add-function :after-while (local 'isearch-filter-predicate) filter))) (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. -- 2.39.2