summaryrefslogtreecommitdiff
path: root/lisp/isearch.el
diff options
context:
space:
mode:
authorAugusto Stoffel <arstoffel@gmail.com>2022-03-20 20:46:31 +0100
committerJuri Linkov <juri@linkov.net>2022-03-20 22:25:28 +0200
commit0f7c3f553f95939e08103adcfef2f1176d120dff (patch)
treeb90b77162b939c6fb148428e8bafb65ad7f4c7b6 /lisp/isearch.el
parent3d204afe3c80cf4b8ab39dfbdb180884630e815b (diff)
downloademacs-0f7c3f553f95939e08103adcfef2f1176d120dff.tar.gz
Allow lazy highlight and match count while reading from minibuffer
* lisp/isearch.el (minibuffer-lazy-highlight-setup): New function, can be added to 'minibuffer-setup-hook' to enable lazy highlight and count while reading from minibuffer. (minibuffer-lazy-count-format, minibuffer-lazy-highlight-transform, minibuffer-lazy-highlight--overlay, minibuffer-lazy-highlight--count, minibuffer-lazy-highlight--after-change, minibuffer-lazy-highlight--exit): Auxiliary variables and functions implementing the lazy highlight functionality while reading from minibuffer.
Diffstat (limited to 'lisp/isearch.el')
-rw-r--r--lisp/isearch.el63
1 files changed, 63 insertions, 0 deletions
diff --git a/lisp/isearch.el b/lisp/isearch.el
index b1951a86591..1ee5f2e9a82 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -4346,6 +4346,69 @@ Attempt to do the search exactly the way the pending Isearch would."
(run-at-time lazy-highlight-interval nil
'isearch-lazy-highlight-buffer-update)))))))))
+
+;; Reading from minibuffer with lazy highlight and match count
+
+(defcustom minibuffer-lazy-count-format "%s "
+ "Format of the total number of matches for the prompt prefix."
+ :type '(choice (const :tag "Don't display a count" nil)
+ (string :tag "Display match count" "%s "))
+ :group 'lazy-count
+ :version "29.1")
+
+(defvar minibuffer-lazy-highlight-transform #'identity
+ "Function to transform minibuffer text into a `isearch-string' for highlighting.")
+
+(defvar minibuffer-lazy-highlight--overlay nil
+ "Overlay for minibuffer prompt updates.")
+
+(defun minibuffer-lazy-highlight--count ()
+ "Display total match count in the minibuffer prompt."
+ (when minibuffer-lazy-highlight--overlay
+ (overlay-put minibuffer-lazy-highlight--overlay
+ 'before-string
+ (and isearch-lazy-count-total
+ (not isearch-error)
+ (format minibuffer-lazy-count-format
+ isearch-lazy-count-total)))))
+
+(defun minibuffer-lazy-highlight--after-change (_beg _end _len)
+ "Update lazy highlight state in minibuffer selected window."
+ (when isearch-lazy-highlight
+ (let ((inhibit-redisplay t) ;; Avoid cursor flickering
+ (string (minibuffer-contents)))
+ (with-minibuffer-selected-window
+ (setq isearch-string (funcall minibuffer-lazy-highlight-transform string))
+ (isearch-lazy-highlight-new-loop)))))
+
+(defun minibuffer-lazy-highlight--exit ()
+ "Unwind changes from `minibuffer-lazy-highlight-setup'."
+ (remove-hook 'after-change-functions
+ #'minibuffer-lazy-highlight--after-change)
+ (remove-hook 'lazy-count-update-hook #'minibuffer-lazy-highlight--count)
+ (remove-hook 'minibuffer-exit-hook #'minibuffer-lazy-highlight--exit)
+ (setq minibuffer-lazy-highlight--overlay nil)
+ (when lazy-highlight-cleanup
+ (lazy-highlight-cleanup)))
+
+(defun minibuffer-lazy-highlight-setup ()
+ "Set up minibuffer for lazy highlight of matches in the original window.
+
+This function is intended to be added to `minibuffer-setup-hook'.
+Note that several other isearch variables influence the lazy
+highlighting, including `isearch-regexp',
+`isearch-lazy-highlight' and `isearch-lazy-count'."
+ (remove-hook 'minibuffer-setup-hook #'minibuffer-lazy-highlight-setup)
+ (add-hook 'after-change-functions
+ #'minibuffer-lazy-highlight--after-change)
+ (add-hook 'lazy-count-update-hook #'minibuffer-lazy-highlight--count)
+ (add-hook 'minibuffer-exit-hook #'minibuffer-lazy-highlight--exit)
+ (setq minibuffer-lazy-highlight--overlay
+ (and minibuffer-lazy-count-format
+ (make-overlay (point-min) (point-min) (current-buffer) t)))
+ (minibuffer-lazy-highlight--after-change nil nil nil))
+
+
(defun isearch-resume (string regexp word forward message case-fold)
"Resume an incremental search.
STRING is the string or regexp searched for.