diff options
| author | Daniel Mendler <mail@daniel-mendler.de> | 2025-11-07 17:07:18 +0100 |
|---|---|---|
| committer | Daniel Mendler <mail@daniel-mendler.de> | 2025-11-07 17:09:06 +0100 |
| commit | 635c9c11ed6db657315e56797d887235e0b82d63 (patch) | |
| tree | e301925e77337b40d21b24d08d3474bf1bba0d56 | |
| parent | 38d9cd90fdaedafdf6f3c8bd0b2a0afac7c80e62 (diff) | |
Introduce corfu--try-completion
Make sure that correct metadata is passed to the underlying
`completion-try-completion`.
| -rw-r--r-- | corfu.el | 37 |
1 files changed, 16 insertions, 21 deletions
@@ -403,15 +403,14 @@ is a prefix length override, which is t for manual completion." (or (eq len t) (>= len corfu-auto-prefix))) ;; For non-exclusive Capfs, check for valid completion. (or (not (eq 'no (plist-get plist :exclusive))) - (let* ((str (buffer-substring-no-properties beg end)) - (pt (- (point) beg)) - (pred (plist-get plist :predicate)) - (md (completion-metadata (substring str 0 pt) table pred))) + (let ((str (buffer-substring-no-properties beg end)) + (pt (- (point) beg)) + (pred (plist-get plist :predicate))) ;; We use `completion-try-completion' to check if there are ;; completions. The upstream `completion--capf-wrapper' uses ;; `try-completion' which is incorrect since it only checks for ;; prefix completions. - (completion-try-completion str table pred pt md))) + (corfu--try-completion str table pred pt))) (cons fun res))))) (defun corfu--make-buffer (name) @@ -582,6 +581,11 @@ FRAME is the existing frame." (and cands (nconc cands base))))) (cons (apply #'completion-all-completions args) completion-lazy-hilit-fn))))) +(defun corfu--try-completion (str table pred pt &optional md) + "Complete STR given TABLE, predicate PRED, point PT and optional metadata MD." + (setq md (or md (completion-metadata (substring str 0 pt) table pred))) + (completion-try-completion str table pred pt md)) + (defsubst corfu--length-string< (x y) "Sorting predicate which compares X and Y first by length then by `string<'." (or (< (length x) (length y)) (and (= (length x) (length y)) (string< x y)))) @@ -955,7 +959,7 @@ See `completion-in-region' for the arguments BEG, END, TABLE, PRED." (threshold (completion--cycle-threshold md)) (completion-in-region-mode-predicate (or completion-in-region-mode-predicate #'always))) - (pcase (completion-try-completion str table pred pt md) + (pcase (corfu--try-completion str table pred pt md) ('nil (corfu--message "No match") nil) ('t (goto-char end) (corfu--message "Sole match") @@ -982,9 +986,7 @@ See `completion-in-region' for the arguments BEG, END, TABLE, PRED." ;; Setup popup if `corfu-on-exact-match' is `show' or if completion ;; can continue. (if (or (eq corfu-on-exact-match 'show) - (consp (completion-try-completion - newstr table pred newpt - (completion-metadata (substring newstr 0 newpt) table pred)))) + (consp (corfu--try-completion newstr table pred newpt))) (corfu--setup beg end table pred) (corfu--exit-function (car cands) 'finished nil))) ;; Too many candidates for cycling -> Setup popup. @@ -1212,9 +1214,7 @@ AUTO is non-nil when initializing auto completion." (equal (car corfu--candidates) str) (not (cdr corfu--candidates)) (not (eq corfu-on-exact-match 'show)) (or auto corfu-on-exact-match) - (not (consp (completion-try-completion - str table pred pt - (completion-metadata (substring str 0 pt) table pred))))) + (not (consp (corfu--try-completion str table pred pt)))) ;; Quit directly when initializing auto completion. (if (or auto (eq corfu-on-exact-match 'quit)) (corfu-quit) @@ -1361,9 +1361,7 @@ If a candidate is selected, insert it. Otherwise invoke (pcase-let ((`(,_beg ,_end ,table ,pred . ,_) completion-in-region--data) (newstr (corfu--insert nil))) (and (test-completion newstr table pred) - (or (not (consp (completion-try-completion - newstr table pred (length newstr) - (completion-metadata newstr table pred)))) + (or (not (consp (corfu--try-completion newstr table pred (length newstr)))) ;; Additionally finish completion if at the end of a boundary, ;; even if other longer candidates match, since the user invoked ;; `corfu-complete' with an explicitly selected candidate! @@ -1382,9 +1380,8 @@ input has been expanded." (corfu-complete) (pcase-let* ((`(,beg ,end ,table ,pred . ,_) completion-in-region--data) (pt (max 0 (- (point) beg))) - (str (buffer-substring-no-properties beg end)) - (md (completion-metadata (substring str 0 pt) table pred))) - (pcase (completion-try-completion str table pred pt md) + (str (buffer-substring-no-properties beg end))) + (pcase (corfu--try-completion str table pred pt) ('t (goto-char end) (corfu--done str 'finished corfu--candidates) @@ -1395,9 +1392,7 @@ input has been expanded." ;; Exit with status 'finished if input is a valid match ;; and no further completion is possible. (and (test-completion newstr table pred) - (not (consp (completion-try-completion - newstr table pred newpt - (completion-metadata (substring newstr 0 newpt) table pred)))) + (not (consp (corfu--try-completion newstr table pred newpt))) (corfu--done newstr 'finished corfu--candidates)) t))))) |
