branch: externals/hotfuzz
commit a7563c9d08ae23abc05f8a184911ff803e52a54b
Author: Axel Forsman <[email protected]>
Commit: Axel Forsman <[email protected]>

    Use completion-lazy-hilit
    
    Closes #17
---
 README.md     | 20 ++++++++++----------
 hotfuzz.el    | 46 +++++++---------------------------------------
 test/tests.el | 16 ----------------
 3 files changed, 17 insertions(+), 65 deletions(-)

diff --git a/README.md b/README.md
index 619bdfe33f..aba81c4f6d 100644
--- a/README.md
+++ b/README.md
@@ -19,20 +19,19 @@ Or, if using [Fido], add hotfuzz to the `completion-styles` 
list this way:
           (lambda () (setq-local completion-styles '(hotfuzz))))
 ```
 
-**Note:** Highlighting of the matched characters is only applied to
+**Note:** Unless the completion UI supports the
+`completion-lazy-hilit` variable, as i.a. [Vertico] and [Corfu] do,
+then highlighting of the matched characters will only be applied to
 the first `hotfuzz-max-highlighted-completions` completions, out of
-performance concerns. The default value is large enough so that
-generally you will need to scroll the list of completions beyond the
-second page to first see non-highlighted completions. If you are
-annoyed by this you can make it highlight all completions instead
-using
+performance concerns. The default value is large enough that generally
+the list of completions will need to be scrolled beyond the second
+page to reach non-highlighted completions. If you are annoyed by this
+you can make it highlight all completions instead using
 ```elisp
 (setq hotfuzz-max-highlighted-completions most-positive-fixnum)
 ```
 provided you are completing small enough lists and/or do not encounter
 performance problems.
-This is a non-issue when using `hotfuzz-vertico-mode` since
-Vertico supports lazy highlighting.
 
 ## Customization
 
@@ -98,11 +97,12 @@ to match according to any other completion style.
 It is very customizable,
 but does no sorting and allows the individual sub-patterns to overlap
 (`"foo foo"` filters no additional items compared to `"foo"`).
-Hotfuzz on the other hand tries to be more *clever* about sorting,
+Hotfuzz on the other hand tries to be more clever about sorting,
 and so users who dislike that may prefer orderless.
 
 [Vertico]: https://github.com/minad/vertico
+[Corfu]: https://github.com/minad/corfu
+[Ido]: https://www.gnu.org/software/emacs/manual/html_node/ido/index.html
 [Fido]: 
https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html
 [flx]: https://github.com/lewang/flx
-[Ido]: https://www.gnu.org/software/emacs/manual/html_node/ido/index.html
 [orderless]: https://github.com/oantolin/orderless
diff --git a/hotfuzz.el b/hotfuzz.el
index 6628c77cd0..bce35da1ba 100644
--- a/hotfuzz.el
+++ b/hotfuzz.el
@@ -124,8 +124,6 @@ HAYSTACK has to be a match according to 
`hotfuzz-all-completions'."
        (add-face-text-property i (1+ i) 'completions-common-part nil 
haystack))))
   haystack)
 
-;;; Completion style implementation
-
 ;;;###autoload
 (defun hotfuzz-all-completions (string table &optional pred point)
   "Get hotfuzz-completions of STRING in TABLE.
@@ -162,13 +160,12 @@ list before passing it to `display-sort-function' or
                  finally (setq all (mapcar #'cdr (sort all 
#'car-less-than-car))))))
     (when all
       (unless (string= needle "")
-        ;; Without deferred highlighting (bug#47711) only highlight
-        ;; the top completions.
-        (cl-loop repeat hotfuzz-max-highlighted-completions and for x in-ref 
all
-                 do (setf x (hotfuzz-highlight needle (copy-sequence x))))
-        (when (zerop hotfuzz-max-highlighted-completions)
-          (setcar all (copy-sequence (car all))))
-        (put-text-property 0 1 'completion-sorted t (car all)))
+        (defvar completion-lazy-hilit-fn) ; Introduced in Emacs 30 (bug#47711)
+        (if (bound-and-true-p completion-lazy-hilit)
+            (setq completion-lazy-hilit-fn (apply-partially 
#'hotfuzz-highlight needle))
+          (cl-loop repeat hotfuzz-max-highlighted-completions and for x in-ref 
all
+                   do (setf x (hotfuzz-highlight needle (copy-sequence x)))))
+        (setcar all (propertize (car all) 'completion-sorted t)))
       (if (string= prefix "") all (nconc all (length prefix))))))
 
 (defun hotfuzz--adjust-metadata (metadata)
@@ -194,37 +191,8 @@ list before passing it to `display-sort-function' or
                '(hotfuzz completion-flex-try-completion hotfuzz-all-completions
                          "Fuzzy completion.")))
 
-;;; Vertico integration
-
-(declare-function vertico--all-completions "ext:vertico")
-(declare-function corfu--all-completions "ext:corfu")
-
-(defun hotfuzz--vertico--all-completions-advice (fun &rest args)
-  "Advice for FUN `vertico--all-completions' to defer hotfuzz highlighting."
-  (cl-letf* ((hl nil)
-             ((symbol-function #'hotfuzz-highlight)
-              (lambda (pattern cand)
-                (setq hl (apply-partially
-                          #'mapcar
-                          (lambda (x) (hotfuzz-highlight pattern 
(copy-sequence x)))))
-                cand))
-             (hotfuzz-max-highlighted-completions 1)
-             (result (apply fun args)))
-    (when hl (setcdr result hl))
-    result))
-
 ;;;###autoload
-(define-minor-mode hotfuzz-vertico-mode
-  "Toggle hotfuzz compatibility code for the Vertico&Corfu completion systems.
-Contrary to what the name might suggest, this mode does not enable
-hotfuzz. You still have to customize e.g. `completion-styles'."
-  :global t
-  (if hotfuzz-vertico-mode
-      (progn
-        (advice-add #'vertico--all-completions :around 
#'hotfuzz--vertico--all-completions-advice)
-        (advice-add #'corfu--all-completions :around 
#'hotfuzz--vertico--all-completions-advice))
-    (advice-remove #'vertico--all-completions 
#'hotfuzz--vertico--all-completions-advice)
-    (advice-remove #'corfu--all-completions 
#'hotfuzz--vertico--all-completions-advice)))
+(define-obsolete-function-alias 'hotfuzz-vertico-mode #'ignore "0.1")
 
 (provide 'hotfuzz)
 ;;; hotfuzz.el ends here
diff --git a/test/tests.el b/test/tests.el
index 62fb3bf0cc..5f5322e59b 100644
--- a/test/tests.el
+++ b/test/tests.el
@@ -96,19 +96,3 @@
        nil
        6) ; Point as in "/usr/s|/man"
       '("share/" . 5)))))
-
-;;; Vertico integration
-
-(ert-deftest vertico--all-completions-advice-test ()
-  (cl-flet ((f (apply-partially
-                #'hotfuzz--vertico--all-completions-advice
-                (lambda (&rest args) (cons (apply #'completion-all-completions 
args) nil)))))
-    ;; If hotfuzz was not tried or produced no matches: Do not set 
highlighting fn
-    (let ((completion-styles '(basic hotfuzz)))
-      (should (equal (f "x" '("x") nil 1) '(("x" . 0) . nil))))
-    (let ((completion-styles '(hotfuzz)))
-      (should (equal (f "y" '("x") nil 1) '(nil . nil)))
-      (cl-destructuring-bind (xs . hl) (f "x" '("x") nil 1)
-        ;; Highlighting should not yet have been applied
-        (should (equal-including-properties xs '(#("x" 0 1 (completion-sorted 
t)))))
-        (should (functionp hl))))))

Reply via email to