diff options
| -rw-r--r-- | CHANGELOG.org | 2 | ||||
| -rw-r--r-- | README.org | 1 | ||||
| -rw-r--r-- | cape.el | 41 |
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) @@ -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. @@ -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") |
