# HG changeset patch # User Stefan Monnier # Date 1118695550 0 # Node ID 23b1ef64a00e818c30d06ee294206092cb744338 # Parent 10ceeb0364c5a5990d95fd6012b298b4306bec12 (complete-in-turn): New macro. (dynamic-completion-table, lazy-completion-table): Add debug info. diff -r 10ceeb0364c5 -r 23b1ef64a00e lisp/subr.el --- a/lisp/subr.el Mon Jun 13 19:33:21 2005 +0000 +++ b/lisp/subr.el Mon Jun 13 20:45:50 2005 +0000 @@ -1923,6 +1923,7 @@ 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")) @@ -1944,12 +1945,29 @@ 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)))))) ;;; Matching and substitution