The result of the `dynamic-completion-table' form is a function
that can be used as the ALIST argument to `try-completion' and
`all-completion'. See Info node `(elisp)Programmed Completion'."
+ (declare (debug (lambda-expr)))
(let ((win (make-symbol "window"))
(string (make-symbol "string"))
(predicate (make-symbol "predicate"))
If completion is requested in the minibuffer, FUN will be called in the buffer
from which the minibuffer was entered. The return value of
`lazy-completion-table' must be used to initialize the value of VAR."
+ (declare (debug (symbol lambda-expr def-body)))
(let ((str (make-symbol "string")))
`(dynamic-completion-table
(lambda (,str)
(unless (listp ,var)
- (setq ,var (funcall ',fun ,@args)))
+ (setq ,var (,fun ,@args)))
,var))))
+
+(defmacro complete-in-turn (a b)
+ "Create a completion table that first tries completion in A and then in B.
+A and B should not be costly (or side-effecting) expressions."
+ (declare (debug (def-form def-form)))
+ `(lambda (string predicate mode)
+ (cond
+ ((eq mode t)
+ (or (all-completions string ,a predicate)
+ (all-completions string ,b predicate)))
+ ((eq mode nil)
+ (or (try-completion string ,a predicate)
+ (try-completion string ,b predicate)))
+ (t
+ (or (test-completion string ,a predicate)
+ (test-completion string ,b predicate))))))
\f
;;; Matching and substitution