X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/477e17c8900a80e7f0afd93c6e06c5a55ff96f32..68122d9b556d682332b1b3a64c67e78f0bf8f8d3:/packages/el-search/el-search.el diff --git a/packages/el-search/el-search.el b/packages/el-search/el-search.el index 496285bb6..0481fef73 100644 --- a/packages/el-search/el-search.el +++ b/packages/el-search/el-search.el @@ -571,6 +571,34 @@ matches the list (1 2 3 4 5 6 7 8 9) and binds `x' to (4 5 6)." `(and (pred symbolp) (app symbol-name (string ,@regexps)))) +(defun el-search--contains-p (matcher exp) + "Return non-nil when tree EXP contains a match for MATCHER. +Recurse on all types of sequences. In the positive case the +return value is (t elt), where ELT is a matching element found in +EXP." + (if (el-search--match-p matcher exp) + (list t exp) + (and (sequencep exp) + (let ((try-match (apply-partially #'el-search--contains-p matcher))) + (if (consp exp) + (or (funcall try-match (car exp)) + (funcall try-match (cdr exp))) + (cl-some try-match exp)))))) + +(el-search-defpattern contains (&rest patterns) + "Matches trees that contain a match for all PATTERNs. +Searches any tree of sequences recursively for matches. Objects +of any kind matched by all PATTERNs are also matched. + + Example: (contains (string \"H\") 17) matches ((\"Hallo\") x (5 [1 17]))" + (cond + ((null patterns) '_) + ((null (cdr patterns)) + (let ((pattern (car patterns))) + `(app ,(apply-partially #'el-search--contains-p (el-search--matcher pattern)) + (,'\` (t (,'\, ,pattern)))))) + (t `(and ,@(mapcar (lambda (pattern) `(contains ,pattern)) patterns))))) + (el-search-defpattern not (pattern) "Matches any object that is not matched by PATTERN." `(app ,(apply-partially #'el-search--match-p (el-search--matcher pattern)) @@ -820,12 +848,7 @@ Hit any key to proceed." (el-search-search-and-replace-pattern from to mapping)) (defun el-search--take-over-from-isearch () - (let ((other-end isearch-other-end) - (input isearch-string)) - (isearch-exit) - (when (and other-end (< other-end (point))) - (goto-char other-end)) - input)) + (prog1 isearch-string (isearch-exit))) ;;;###autoload (defun el-search-search-from-isearch ()