branch: externals/corfu
commit b11a206c6e3a38d1dd91d29a72ff128580d35174
Author: Daniel Mendler <m...@daniel-mendler.de>
Commit: Daniel Mendler <m...@daniel-mendler.de>

    corfu-indexed-mode: Do not use advices
---
 extensions/corfu-indexed.el | 32 ++++++++++++--------------------
 1 file changed, 12 insertions(+), 20 deletions(-)

diff --git a/extensions/corfu-indexed.el b/extensions/corfu-indexed.el
index 6ee832b39a..8621247090 100644
--- a/extensions/corfu-indexed.el
+++ b/extensions/corfu-indexed.el
@@ -56,18 +56,17 @@
   '(corfu-insert corfu-complete)
   "Commands that should be indexed.")
 
-(defun corfu-indexed--handle-prefix (orig &rest args)
-  "Handle prefix argument before calling ORIG function with ARGS."
-  (if (and current-prefix-arg (called-interactively-p t))
-      (let ((corfu--index (+ corfu--scroll
-                             (- (prefix-numeric-value current-prefix-arg)
-                                corfu-indexed-start))))
-        (if (or (< corfu--index 0)
-                (>= corfu--index corfu--total)
-                (>= corfu--index (+ corfu--scroll corfu-count)))
-            (message "Out of range")
-          (funcall orig)))
-    (apply orig args)))
+(cl-defmethod corfu--prepare :before (&context (corfu-indexed-mode (eql t)))
+  (when (and prefix-arg (memq this-command corfu-indexed--commands))
+    (let ((index (+ corfu--scroll
+                    (- (prefix-numeric-value prefix-arg)
+                       corfu-indexed-start))))
+      (if (and (>= index 0)
+               (< index corfu--total)
+               (< index (+ corfu--scroll corfu-count)))
+          (setq corfu--index index)
+        (message "Out of range")
+        (setq this-command #'ignore)))))
 
 (cl-defmethod corfu--affixate :around (cands &context (corfu-indexed-mode (eql 
t)))
   (setq cands (cdr (cl-call-next-method cands)))
@@ -92,14 +91,7 @@
 ;;;###autoload
 (define-minor-mode corfu-indexed-mode
   "Prefix candidates with indices."
-  :global t :group 'corfu
-  ;; TODO I had forgotten that `corfu-indexed-mode' is double evil, since it
-  ;; uses advices and the forbidden function `called-interactively-p'. Find a
-  ;; better implementation which avoids these kludges.
-  (dolist (cmd corfu-indexed--commands)
-    (if corfu-indexed-mode
-        (advice-add cmd :around #'corfu-indexed--handle-prefix)
-      (advice-remove cmd #'corfu-indexed--handle-prefix))))
+  :global t :group 'corfu)
 
 (provide 'corfu-indexed)
 ;;; corfu-indexed.el ends here

Reply via email to