emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/subr.el


From: Richard M. Stallman
Subject: [Emacs-diffs] Changes to emacs/lisp/subr.el
Date: Mon, 30 Jun 2003 06:33:53 -0400

Index: emacs/lisp/subr.el
diff -c emacs/lisp/subr.el:1.356 emacs/lisp/subr.el:1.357
*** emacs/lisp/subr.el:1.356    Wed Jun 18 17:49:16 2003
--- emacs/lisp/subr.el  Mon Jun 30 06:33:52 2003
***************
*** 1778,1783 ****
--- 1778,1820 ----
         (save-current-buffer
           (set-buffer ,old-buffer)
           (set-syntax-table ,old-table))))))
+ 
+ (defmacro dynamic-completion-table (fun)
+   "Use function FUN as a dynamic completion table.
+ FUN is called with one argument, the string for which completion is required,
+ and it should return an alist containing all the intended possible
+ completions. This alist may be a full list of possible completions so that FUN
+ can ignore the value of its argument. If completion is performed in the
+ minibuffer, FUN will be called in the buffer from which the minibuffer was
+ entered. `dynamic-completion-table' then computes the completion, see Info
+ node `(elisp)Programmed Completion'."
+   (let ((win (make-symbol "window"))
+         (string (make-symbol "string"))
+         (predicate (make-symbol "predicate"))
+         (mode (make-symbol "mode")))
+     `(lambda (,string ,predicate ,mode)
+        (with-current-buffer (let ((,win (minibuffer-selected-window)))
+                               (if (window-live-p ,win) (window-buffer ,win)
+                                 (current-buffer)))
+          (cond
+           ((eq ,mode t) (all-completions ,string (,fun ,string) ,predicate))
+           ((not ,mode) (try-completion ,string (,fun ,string) ,predicate))
+           (t (test-completion ,string (,fun ,string) ,predicate)))))))
+ 
+ (defmacro lazy-completion-table (var fun &rest args)
+   "Initialize variable VAR as a lazy completion table.
+ If the completion table VAR is used for the first time (e.g., by passing VAR
+ as an argument to `try-completion'), the function FUN is called with arguments
+ ARGS. FUN must return the completion table that will be stored in VAR. 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."
+   (let ((str (make-symbol "string")))
+     `(dynamic-completion-table
+       (lambda (,str)
+         (unless (listp ,var)
+           (setq ,var (funcall ',fun ,@args)))
+         ,var))))
  
  ;;; Matching and substitution
  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]