emacs-diffs
[Top][All Lists]
Advanced

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

master 3cfac1fe07: Display the number of invisible matches for isearch-l


From: Juri Linkov
Subject: master 3cfac1fe07: Display the number of invisible matches for isearch-lazy-count (bug#40808)
Date: Fri, 8 Jul 2022 13:47:33 -0400 (EDT)

branch: master
commit 3cfac1fe073815bdbba96e3a35a1c15626022c07
Author: Juri Linkov <juri@linkov.net>
Commit: Juri Linkov <juri@linkov.net>

    Display the number of invisible matches for isearch-lazy-count (bug#40808)
    
    * lisp/isearch.el (lazy-count-invisible-format): New variable.
    (isearch-mode): Set isearch-lazy-count-invisible to nil.
    (isearch-lazy-count-format): Use lazy-count-invisible-format and
    isearch-lazy-count-invisible.
    (isearch-range-invisible): Handle the value 'can-be-opened' of
    'search-invisible' and don't open overlays for it, just check
    if these overlays can be opened.
    (isearch-lazy-count-invisible): New variable.
    (isearch-lazy-highlight-new-loop): Set isearch-lazy-count-invisible to nil.
    (isearch-lazy-highlight-search): Let-bind search-invisible either to t
    for non-nil isearch-lazy-count, or to 'can-be-opened'.
    (isearch-lazy-highlight-match): Don't highlight matches intended
    to be counted only, not highlighted.
    (isearch-lazy-highlight-buffer-update): Separately count invisible
    matches by isearch-lazy-count-invisible.
    
    * lisp/info.el (Info-isearch-filter): Check if search-invisible is t.
---
 lisp/info.el    |  2 +-
 lisp/isearch.el | 82 +++++++++++++++++++++++++++++++++++++++------------------
 2 files changed, 58 insertions(+), 26 deletions(-)

diff --git a/lisp/info.el b/lisp/info.el
index 906385fdc7..0d0dda8c06 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -2208,7 +2208,7 @@ and is not in the header line or a tag table."
     (let ((backward (< found beg-found)))
       (not
        (or
-       (and (not search-invisible)
+       (and (not (eq search-invisible t))
             (if backward
                 (or (text-property-not-all found beg-found 'invisible nil)
                     (text-property-not-all found beg-found 'display nil))
diff --git a/lisp/isearch.el b/lisp/isearch.el
index db7b53c014..ad8897dda2 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -466,6 +466,12 @@ and doesn't remove full-buffer highlighting after a 
search."
   :group 'lazy-count
   :version "27.1")
 
+(defvar lazy-count-invisible-format " (invisible %s)"
+  "Format of the number of invisible matches for the prompt.
+When invisible matches exist, their number is appended
+after the total number of matches.  Display nothing when
+this variable is nil.")
+
 
 ;; Define isearch help map.
 
@@ -1277,6 +1283,7 @@ used to set the value of `isearch-regexp-function'."
 
        isearch-lazy-count-current nil
        isearch-lazy-count-total nil
+       isearch-lazy-count-invisible nil
 
        ;; Save the original value of `minibuffer-message-timeout', and
        ;; set it to nil so that isearch's messages don't get timed out.
@@ -3529,7 +3536,12 @@ isearch-message-suffix prompt.  Otherwise, for 
isearch-message-prefix."
                     (- isearch-lazy-count-total
                        isearch-lazy-count-current
                        -1)))
-                (or isearch-lazy-count-total "?"))
+                (if (and isearch-lazy-count-invisible
+                         lazy-count-invisible-format)
+                    (concat (format "%s" (or isearch-lazy-count-total "?"))
+                            (format lazy-count-invisible-format
+                                    isearch-lazy-count-invisible))
+                  (or isearch-lazy-count-total "?")))
       "")))
 
 
@@ -3780,10 +3792,11 @@ Optional third argument, if t, means if fail just 
return nil (no error).
     (save-excursion
       (goto-char beg)
       (let (;; can-be-opened keeps track if we can open some overlays.
-           (can-be-opened (eq search-invisible 'open))
+           (can-be-opened (memq search-invisible '(open can-be-opened)))
            ;; the list of overlays that could be opened
            (crt-overlays nil))
-       (when (and can-be-opened isearch-hide-immediately)
+       (when (and can-be-opened isearch-hide-immediately
+                  (not (eq search-invisible 'can-be-opened)))
          (isearch-close-unnecessary-overlays beg end))
        ;; If the following character is currently invisible,
        ;; skip all characters with that same `invisible' property value.
@@ -3822,9 +3835,10 @@ Optional third argument, if t, means if fail just return 
nil (no error).
        (if (>= (point) end)
            (if (and can-be-opened (consp crt-overlays))
                (progn
-                 (setq isearch-opened-overlays
-                       (append isearch-opened-overlays crt-overlays))
-                 (mapc 'isearch-open-overlay-temporary crt-overlays)
+                 (unless (eq search-invisible 'can-be-opened)
+                   (setq isearch-opened-overlays
+                         (append isearch-opened-overlays crt-overlays))
+                   (mapc 'isearch-open-overlay-temporary crt-overlays))
                  nil)
              (setq isearch-hidden t)))))))
 
@@ -4008,6 +4022,7 @@ since they have special meaning in a regexp."
 (defvar isearch-lazy-highlight-error nil)
 (defvar isearch-lazy-count-current nil)
 (defvar isearch-lazy-count-total nil)
+(defvar isearch-lazy-count-invisible nil)
 (defvar isearch-lazy-count-hash (make-hash-table))
 (defvar lazy-count-update-hook nil
   "Hook run after new lazy count results are computed.")
@@ -4086,7 +4101,8 @@ by other Emacs features."
         ;; Reset old counter before going to count new numbers
         (clrhash isearch-lazy-count-hash)
         (setq isearch-lazy-count-current nil
-              isearch-lazy-count-total nil)
+              isearch-lazy-count-total nil
+              isearch-lazy-count-invisible nil)
         ;; Delay updating the message if possible, to avoid flicker
         (when (string-equal isearch-string "")
           (when (and isearch-mode (null isearch-message-function))
@@ -4166,10 +4182,10 @@ Attempt to do the search exactly the way the pending 
Isearch would."
            (isearch-regexp-lax-whitespace
             isearch-lazy-highlight-regexp-lax-whitespace)
            (isearch-forward isearch-lazy-highlight-forward)
-           ;; Don't match invisible text unless it can be opened
-           ;; or when counting matches and user can visit hidden matches
-           (search-invisible (or (eq search-invisible 'open)
-                                 (and isearch-lazy-count search-invisible)))
+           ;; Count all invisible matches, but highlight only
+           ;; matches that can be opened by visiting them later
+           (search-invisible (or (not (null isearch-lazy-count))
+                                 'can-be-opened))
            (retry t)
            (success nil))
        ;; Use a loop like in `isearch-search'.
@@ -4186,15 +4202,20 @@ Attempt to do the search exactly the way the pending 
Isearch would."
     (error nil)))
 
 (defun isearch-lazy-highlight-match (mb me)
-  (let ((ov (make-overlay mb me)))
-    (push ov isearch-lazy-highlight-overlays)
-    ;; 1000 is higher than ediff's 100+,
-    ;; but lower than isearch main overlay's 1001
-    (overlay-put ov 'priority 1000)
-    (overlay-put ov 'face 'lazy-highlight)
-    (unless (or (eq isearch-lazy-highlight 'all-windows)
-                isearch-lazy-highlight-buffer)
-      (overlay-put ov 'window (selected-window)))))
+  (when (or (not isearch-lazy-count)
+            ;; Recheck the match that possibly was intended
+            ;; for counting only, but not for highlighting
+            (let ((search-invisible 'can-be-opened))
+              (funcall isearch-filter-predicate mb me)))
+    (let ((ov (make-overlay mb me)))
+      (push ov isearch-lazy-highlight-overlays)
+      ;; 1000 is higher than ediff's 100+,
+      ;; but lower than isearch main overlay's 1001
+      (overlay-put ov 'priority 1000)
+      (overlay-put ov 'face 'lazy-highlight)
+      (unless (or (eq isearch-lazy-highlight 'all-windows)
+                  isearch-lazy-highlight-buffer)
+        (overlay-put ov 'window (selected-window))))))
 
 (defun isearch-lazy-highlight-start ()
   "Start a new lazy-highlight updating loop."
@@ -4328,11 +4349,22 @@ Attempt to do the search exactly the way the pending 
Isearch would."
                                (setq found nil)
                              (forward-char -1)))
                        (when isearch-lazy-count
-                         (setq isearch-lazy-count-total
-                               (1+ (or isearch-lazy-count-total 0)))
-                         (puthash (if isearch-lazy-highlight-forward me mb)
-                                  isearch-lazy-count-total
-                                  isearch-lazy-count-hash))
+                         ;; Count as invisible when can't open overlay,
+                         ;; but don't leave search-invisible with the
+                         ;; value `open' since then lazy-highlight
+                         ;; will open all overlays with matches.
+                         (if (not (let ((search-invisible
+                                         (if (eq search-invisible 'open)
+                                             'can-be-opened
+                                           search-invisible)))
+                                    (funcall isearch-filter-predicate mb me)))
+                             (setq isearch-lazy-count-invisible
+                                   (1+ (or isearch-lazy-count-invisible 0)))
+                           (setq isearch-lazy-count-total
+                                 (1+ (or isearch-lazy-count-total 0)))
+                           (puthash (if isearch-lazy-highlight-forward me mb)
+                                    isearch-lazy-count-total
+                                    isearch-lazy-count-hash)))
                        ;; Don't highlight the match when this loop is used
                        ;; only to count matches or when matches were already
                        ;; highlighted within the current window boundaries



reply via email to

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