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.
This commit is contained in:
Juri Linkov 2022-07-08 20:47:11 +03:00
parent ef559dcd2a
commit 3cfac1fe07
2 changed files with 58 additions and 26 deletions

View file

@ -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))

View file

@ -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