branch: externals/hyperbole commit e34dc5e84611a47be8312bbf265d1b3ad72dd5ef Author: Bob Weiner <r...@gnu.org> Commit: Bob Weiner <r...@gnu.org>
Fix hyrolo logical expressions not matching across whole entry trees --- ChangeLog | 5 +++++ hyrolo.el | 23 ++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index dc3198a636..cce7ce1c29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2022-03-20 Bob Weiner <r...@gnu.org> + +* hyrolo.el (hyrolo-fgrep): Fix to match logical expressions across an entire tree of entries + when no matches within individual subentries. + 2022-03-13 Bob Weiner <r...@gnu.org> * hyrolo.el (hyrolo-sort): Simplify and fix multi-level entry sorting. diff --git a/hyrolo.el b/hyrolo.el index 1c9daa0271..2fda1b9a2b 100644 --- a/hyrolo.el +++ b/hyrolo.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 7-Jun-89 at 22:08:29 -;; Last-Mod: 13-Mar-22 at 10:47:52 by Bob Weiner +;; Last-Mod: 20-Mar-22 at 10:53:11 by Bob Weiner ;; ;; Copyright (C) 1991-2021 Free Software Foundation, Inc. ;; See the "HY-COPY" file for license information. @@ -382,7 +382,7 @@ Return entry name if found, else nil." ;;;###autoload (defun hyrolo-fgrep (string &optional max-matches hyrolo-file count-only no-display) - "Display rolo entries matching STRING (or a logical match expression). + "Display rolo entries matching STRING (or a logical match expression) and return count of matches. To a maximum of optional prefix arg MAX-MATCHES, in file(s) from optional HYROLO-FILE or `hyrolo-file-list'. Default is to find all matching entries. Each entry is displayed with all of its sub-entries. Optional COUNT-ONLY @@ -397,12 +397,17 @@ Return number of entries matched. See also documentation for the variable `hyrolo-file-list' and the function `hyrolo-fgrep-logical' for documentation on the logical expression matching." (interactive "sFind rolo string (or logical expression): \nP") - (let ((total-matches - (if (string-match "\(\\(and\\|or\\|xor\\|not\\)\\>" string) - ;; Search string contains embedded logic operators. - (hyrolo-fgrep-logical string count-only nil t) - (hyrolo-grep (regexp-quote string) max-matches - hyrolo-file count-only no-display)))) + (let ((total-matches 0)) + (if (string-match "\(\\(and\\|or\\|xor\\|not\\)\\>" string) + (progn + ;; Search string contains embedded logic operators. + ;; First try to match logical expression within a single + ;; subentry to minimize entries displayed. If no match, + ;; then match across ancestors and descendants. + (when (zerop (setq total-matches (hyrolo-fgrep-logical string count-only nil t))) + (hyrolo-fgrep-logical string count-only t t))) + (setq total-matches (hyrolo-grep (regexp-quote string) max-matches + hyrolo-file count-only no-display))) (if (called-interactively-p 'interactive) (message "%s matching entr%s found in rolo." (if (= total-matches 0) "No" total-matches) @@ -426,7 +431,7 @@ the logical expression matching." ;;;###autoload (defun hyrolo-grep (regexp &optional max-matches hyrolo-file-or-bufs count-only no-display) - "Display rolo entries matching REGEXP. + "Display rolo entries matching REGEXP and return count of matches. To a maximum of prefix arg MAX-MATCHES, in buffer(s) from optional HYROLO-FILE-OR-BUFS or hyrolo-file-list. Default is to find all matching entries. Each entry is displayed with all of its sub-entries. Optional COUNT-ONLY non-nil means don't