branch: externals/vertico commit 34e8897652cbbee686a9ace4cdb32782eaea223c Author: Daniel Mendler <m...@daniel-mendler.de> Commit: Daniel Mendler <m...@daniel-mendler.de>
vertico-indexed-mode: Do not use advices --- extensions/vertico-indexed.el | 32 ++++++++++++-------------------- vertico.el | 10 +++++----- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/extensions/vertico-indexed.el b/extensions/vertico-indexed.el index 61e406bb31..747ebab1a5 100644 --- a/extensions/vertico-indexed.el +++ b/extensions/vertico-indexed.el @@ -50,18 +50,17 @@ (defvar-local vertico-indexed--min 0) (defvar-local vertico-indexed--max 0) -(defun vertico-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 ((vertico--index (+ vertico-indexed--min - (- (prefix-numeric-value current-prefix-arg) - vertico-indexed-start)))) - (if (or (< vertico--index vertico-indexed--min) - (> vertico--index vertico-indexed--max) - (= vertico--total 0)) - (minibuffer-message "Out of range") - (funcall orig))) - (apply orig args))) +(cl-defmethod vertico--prepare :before (&context (vertico-indexed-mode (eql t))) + (when (and prefix-arg (memq this-command vertico-indexed--commands)) + (let ((index (+ vertico-indexed--min + (- (prefix-numeric-value prefix-arg) + vertico-indexed-start)))) + (if (and (>= index vertico-indexed--min) + (< index vertico-indexed--max) + (/= vertico--total 0)) + (setq vertico--index index) + (minibuffer-message "Out of range") + (setq this-command #'ignore))))) (cl-defmethod vertico--format-candidate :around (cand prefix suffix index start &context (vertico-indexed-mode (eql t))) @@ -79,14 +78,7 @@ ;;;###autoload (define-minor-mode vertico-indexed-mode "Prefix candidates with indices." - :global t :group 'vertico - ;; TODO I had forgotten that `vertico-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 vertico-indexed--commands) - (if vertico-indexed-mode - (advice-add cmd :around #'vertico-indexed--handle-prefix) - (advice-remove cmd #'vertico-indexed--handle-prefix)))) + :global t :group 'vertico) (provide 'vertico-indexed) ;;; vertico-indexed.el ends here diff --git a/vertico.el b/vertico.el index f41b0710ff..460fc94428 100644 --- a/vertico.el +++ b/vertico.el @@ -415,11 +415,6 @@ The function is configured by BY, BSIZE, BINDEX, BPRED and PRED." "Return t if PATH is a remote path." (string-match-p "\\`/[^/|:]+:" (substitute-in-file-name path))) -(defun vertico--prepare () - "Ensure that the state is prepared before running the next command." - (when (and (symbolp this-command) (string-prefix-p "vertico-" (symbol-name this-command))) - (vertico--update))) - (defun vertico--update (&optional interruptible) "Update state, optionally INTERRUPTIBLE." (let* ((pt (max 0 (- (point) (minibuffer-prompt-end)))) @@ -634,6 +629,11 @@ The function is configured by BY, BSIZE, BINDEX, BPRED and PRED." (and (< dp 0) (eq vertico-resize t))) (window-resize nil dp nil nil 'pixelwise))))) +(cl-defgeneric vertico--prepare () + "Ensure that the state is prepared before running the next command." + (when (and (symbolp this-command) (string-prefix-p "vertico-" (symbol-name this-command))) + (vertico--update))) + (cl-defgeneric vertico--setup () "Setup completion UI." (setq vertico--input t