PREV UP next GNU Emacs Lisp Reference Manual

17.5.6: Programmed Completion

Sometimes it is not possible to create an alist or an obarray containing all the intended possible completions. In such a case, you can supply your own function to compute the completion of a given string. This is called programmed completion.

To use this feature, pass a symbol with a function definition as the collection argument to completing-read. The function completing-read arranges to pass your completion function along to try-completion and all-completions, which will then let your function do all the work.

The completion function should accept three arguments:

  • The string to be completed.
  • The predicate function to filter possible matches, or nil if none. Your function should call the predicate for each possible match, and ignore the possible match if the predicate returns nil.
  • A flag specifying the type of operation.

There are three flag values for three operations:

  • nil specifies try-completion. The completion function should return the completion of the specified string, or t if the string is an exact match already, or nil if the string matches no possibility.
  • t specifies all-completions. The completion function should return a list of all possible completions of the specified string.
  • lambda specifies a test for an exact match. The completion function should return t if the specified string is an exact match for some possibility; nil otherwise.

It would be consistent and clean for completion functions to allow lambda expressions (lists that are functions) as well as function symbols as collection, but this is impossible. Lists as completion tables are already assigned another meaning---as alists. It would be unreliable to fail to handle an alist normally because it is also a possible function. So you must arrange for any function you wish to use for completion to be encapsulated in a symbol.

Emacs uses programmed completion when completing file names. See File Name Completion.