summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.org2
-rw-r--r--README.org1
-rw-r--r--cape.el41
3 files changed, 35 insertions, 9 deletions
diff --git a/CHANGELOG.org b/CHANGELOG.org
index fa38f0c..006f13c 100644
--- a/CHANGELOG.org
+++ b/CHANGELOG.org
@@ -10,6 +10,8 @@
- ~cape-capf-trigger~, ~cape-wrap-trigger~: New Capf transformer for trigger
characters. The Capf will only complete if the trigger character occurs before
point. See also ~corfu-auto-trigger~.
+- ~cape-capf-choose~, ~cape-wrap-choose~: New Capf transformer to choose from
+ multiple Capfs.
* Version 2.2 (2025-10-13)
diff --git a/README.org b/README.org
index 532e311..48924be 100644
--- a/README.org
+++ b/README.org
@@ -249,6 +249,7 @@ the Capf transformers with =defalias= to a function symbol.
- ~cape-capf-accept-all~, ~cape-wrap-accept-all~: Create a Capf which accepts every input as valid.
- ~cape-capf-case-fold~, ~cape-wrap-case-fold~: Create a Capf which is case insensitive.
+- ~cape-capf-choose~, ~cape-wrap-choose~: Choose from multiple Capfs.
- ~cape-capf-debug~, ~cape-wrap-debug~: Create a Capf which prints debugging messages.
- ~cape-capf-inside-code~, ~cape-wrap-inside-code~: Ensure that Capf triggers only inside code.
- ~cape-capf-inside-comment~, ~cape-wrap-inside-comment~: Ensure that Capf triggers only inside comments.
diff --git a/cape.el b/cape.el
index ca8e4cd..bc892ee 100644
--- a/cape.el
+++ b/cape.el
@@ -902,7 +902,10 @@ the `completion-at-point-functions':
(list (cape-capf-super \\='elisp-completion-at-point
:with \\='tempel-complete)
(cape-capf-super \\='cape-dabbrev
- :with \\='tempel-complete)))"
+ :with \\='tempel-complete)))
+
+See the dual `cape-wrap-choose' if you want to try multiple Capfs in
+turn."
(when-let ((results (cl-loop for capf in capfs until (eq capf :with)
for res = (funcall capf)
if res collect (cons t res))))
@@ -1008,6 +1011,24 @@ the `completion-at-point-functions':
cape--super-functions)))))
;;;###autoload
+(defun cape-wrap-choose (&rest capfs)
+ "Call each of CAPFS in turn and return first non-nil result.
+Use `cape-wrap-choose' to create a single Capf from multiple Capfs.
+Usually you want to add multiple non-exclusive Capfs to the variable
+`completion-at-point-functions' directly instead. See the dual
+`cape-wrap-super' if you want to merge multiple Capf results."
+ (cl-loop
+ for capf in capfs thereis
+ (pcase (funcall capf)
+ ((and result `(,beg ,end ,table . ,plist))
+ (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)))
+ (and (completion-try-completion str table pred pt md)
+ result))))))
+
+;;;###autoload
(defun cape-wrap-debug (capf &optional name)
"Call CAPF and return a completion table which prints trace messages.
If CAPF is an anonymous lambda, pass the Capf NAME explicitly for
@@ -1260,14 +1281,15 @@ This function can be used as an advice around an existing Capf."
(make-obsolete 'cape-capf-purify nil "2.2")
(dolist (wrapper (list #'cape-wrap-accept-all #'cape-wrap-buster
- #'cape-wrap-case-fold #'cape-wrap-debug
- #'cape-wrap-inside-code #'cape-wrap-inside-comment
- #'cape-wrap-inside-faces #'cape-wrap-inside-string
- #'cape-wrap-nonexclusive #'cape-wrap-noninterruptible
- #'cape-wrap-passthrough #'cape-wrap-predicate
- #'cape-wrap-prefix-length #'cape-wrap-properties
- 'cape-wrap-purify #'cape-wrap-silent
- #'cape-wrap-sort #'cape-wrap-super #'cape-wrap-trigger))
+ #'cape-wrap-case-fold #'cape-wrap-choose
+ #'cape-wrap-debug #'cape-wrap-inside-code
+ #'cape-wrap-inside-comment #'cape-wrap-inside-faces
+ #'cape-wrap-inside-string #'cape-wrap-nonexclusive
+ #'cape-wrap-noninterruptible #'cape-wrap-passthrough
+ #'cape-wrap-predicate #'cape-wrap-prefix-length
+ #'cape-wrap-properties 'cape-wrap-purify
+ #'cape-wrap-silent #'cape-wrap-sort
+ #'cape-wrap-super #'cape-wrap-trigger))
(let ((name (string-remove-prefix "cape-wrap-" (symbol-name wrapper))))
(defalias (intern (format "cape-capf-%s" name))
(lambda (capf &rest args) (lambda () (apply wrapper capf args)))
@@ -1278,6 +1300,7 @@ See `%s' for documentation." name wrapper wrapper))))
;;;###autoload (autoload 'cape-capf-accept-all "cape")
;;;###autoload (autoload 'cape-capf-buster "cape")
;;;###autoload (autoload 'cape-capf-case-fold "cape")
+;;;###autoload (autoload 'cape-capf-choose "cape")
;;;###autoload (autoload 'cape-capf-debug "cape")
;;;###autoload (autoload 'cape-capf-inside-code "cape")
;;;###autoload (autoload 'cape-capf-inside-comment "cape")