[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 0f7c3f553f 2/4: Allow lazy highlight and match count while readin
From: |
Juri Linkov |
Subject: |
master 0f7c3f553f 2/4: Allow lazy highlight and match count while reading from minibuffer |
Date: |
Sun, 20 Mar 2022 16:31:22 -0400 (EDT) |
branch: master
commit 0f7c3f553f95939e08103adcfef2f1176d120dff
Author: Augusto Stoffel <arstoffel@gmail.com>
Commit: Juri Linkov <juri@linkov.net>
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.
---
lisp/isearch.el | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/lisp/isearch.el b/lisp/isearch.el
index b1951a8659..1ee5f2e9a8 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.