前: Reading File Names, 上: Completion
意図した補完候補を持った連想リストやオブジェクト配列を 作成することが困難な場合もあります。 そのような場合、与えられた文字列に対する補完を計算する 独自の関数を与えることができます。 これをプログラム補完(programmed completion)と呼びます。
この機能を使うには、completing-read
の引数collectionに
関数定義を持つシンボルを渡します。
関数completing-read
は、
try-completion
やall-completions
に
読者の補完関数を渡すようにして、読者の関数にすべてを任せます。
補完関数はつぎの3つの引数を受け取ります。
nil
。
読者の関数では、各補完候補についてこの述語を呼び出し、
nil
が返されたら当該候補を無視する。
3つの操作型に対応してフラグの値は3つあります。
nil
はtry-completion
を指定する。
補完関数は、指定された文字列の補完を返すこと。
あるいは、文字列が一意に完全に一致する場合にはt
を返し、
文字列の補完がまったくなければnil
を返す。
文字列が一意に完全に一致する場合であっても、
より長い候補に一致する場合には、
この関数はt
ではなく文字列を返すこと。
t
はall-completions
を指定する。
補完関数は、指定された文字列に対する補完のリストを返すこと。
lambda
は、完全な一致を指定する。
補完関数は、指定された文字列が候補に完全に一致する場合にはt
を返し、
さもなければnil
を返すこと。
補完関数collectionには関数シンボルに加えて、 ラムダ式(関数であるリスト)も許すほうが 一貫性があって見通しがよいはずですが、それは不可能です。 リストには補完候補表としての意味がすでにあり、連想リストがそれです。 関数としての可能性もある通常の連想リストの扱いに失敗するようでは、 信頼性がなくなります。 そのため、読者が補完に使用したい関数は、 シンボルに入れておく必要があるのです。
Emacsは、ファイル名の補完にはプログラム補完を用います。 See File Name Completion。