Next: 通常バッファーでの補完, Previous: 補完変数, Up: 補完 [Contents][Index]
意図した利用可能な補完のすべてを含むalistかobarrayを事前に作成するのが不可能または不便なことがあります。このような場合は与えられた文字列にたいする補完を計算するために独自の関数を提供できます。これはプログラム補完(programmed completion)と呼ばれます。Emacsは数あるケースの中でも特にファイル名の補完(ファイル名の補完を参照)でプログラム補完を使用しています。
この機能を使用するためには、関数をcompleting-readのcollection引数として渡します。関数completing-readはその補完関数がtry-completion、all-completionsなどの基本的な補完関数に渡されて、その関数がすべてを行えるよう取り計らいます。
補完関数は3つの引数を受け取ります:
nil。関数は利用可能なマッチにたいしてこの述語(predicate)を呼び出して、述語がnilをリターンしたらそのマッチを無視する。
nilこれはtry-completionを指定する。マッチがなければ関数はnilをリターンすること。指定された文字列が一意でかつ正確にマッチしたらtをリターンすること。それ以外ならすべてのマッチに共通な最長の前置部分文字列をリターンすること。
tall-completionsを指定する。関数は指定された文字列の利用可能なすべての補完のリストをリターンする。
lambdatest-completionを指定する。関数は指定された文字列がいくつかの補完候補に完全一致するならt、それ以外はnilをリターンする。
(boundaries . suffix)completion-boundariesを指定する。関数は(boundaries start
.
end)をリターンする。ここでstartは指定された文字列内の境界の開始位置、endはsuffix内の境界の終了位置。
Lispプログラムが些細とは言えない境界をリターンする場合には、それらとall-completions操作との整合を確認すること。all-completionsがリターンする補完は、補完境界がカバーするプレフィックスとサフィックスだけに関係していること。補完境界に期待される正確なセマンティックスについては基本的な補完関数を参照のこと。
metadataカレント補完の状態に関する情報の要求を指定する。リターン値は(metadata
. alist)の形式をもち、alistは以下で説明する要素をもつ連想リスト。
フラグに他の値が指定されたら、補完関数はnilをリターンする。
以下はmetadataフラグ引数への応答として補完関数がリターンするかもしれないmetadataエントリーのリストです:
category値は補完関数が補完を試みているテキストの種類を説明するシンボル。シンボルがcompletion-category-overrides内のキーの1つにマッチする場合、通常の補完動作はオーバーライドされる。補完変数を参照のこと。
annotation-function値は補完に注釈(annotation)を付ける関数。この関数は1つの引数stringを受け取り、これは利用可能な補完である。リターン値は文字列で、*Completions*バッファー内の補完stringの後に表示される。この関数が自身で注釈サフィックス文字列にフェイスをputしなければ、その文字列にはデフォルトでcompletions-annotationsフェイスが追加される。
affixation-function値は補完にプレフィックスとサフィックスを追加する関数であること。この関数は単一の引数としてcompletions
(可能な補完のリスト)を受け取り、それぞれの要素が3要素(補完、*Completions*バッファーにおいて補完文字列の前に表示するプレフィックス、補完文字列の後に表示するサフィックス)のリストであるようなcompletionsリストをリターンすること。この関数はannotation-functionより優先される。
group-function値は補完候補をグループ化するための関数であること。この関数はcompletion (補完候補)、transform
(ブーリーンフラグ)という2つの引数を受け取らなければならない。transformがnilなら、その関数は補完候補が属するグループのグループタイトルをリターンしなければならない。リターンされるタイトルはnilでもよい。それ以外なら、その関数は変換された候補をリターンしなければならない。この変換はたとえば、グループタイトルに表示される冗長なプレフィックスの削除などが考えられる。
display-sort-function値は補完をソートする関数。関数は1つの引数をとる。これは補完文字列のリストで、ソートされた補完文字列リストがリターンされる。その入力のリストは破壊的に変更することが許容される。
cycle-sort-function値はcompletion-cycle-thresholdが非nil、かつユーザーが補完候補を巡回するときに補完をソートする関数。引数のリストとリターン値はdisplay-sort-functionと同様。
この関数はプログラムされた補完関数として動作可能な関数を記述する便利な方法である。引数functionは1つの引数(文字列)をとる関数であり、利用可能な補完すべてを含む補完テーブル(基本的な補完関数を参照)をリターンする。functionがリターンするテーブルには文字列引数にマッチしない要素を含めることもできる。これらはcompletion-table-dynamicによって自動的にフィルターされる。特にfunctionは引数を無視して利用可能なすべての補完の完全なリストをリターンできる。completion-table-dynamicをfunctionとプログラムされた補完関数との間の変換器として考えることができる。
オプション引数switch-bufferが非nil、かつ補完がミニバッファーで行われた場合、functionはそのミニバッファーにエンターしたときのバッファーをカレントバッファーにセットして呼び出される。
completion-table-dynamicのリターン値はtry-completionおよびall-completionsの2つ目の引数として使用できる。この関数は常に空のメタデータと無意味な境界をリターンすることに注意。
これは前回の引数/結果ペアーを保存するcompletion-table-dynamicにたいするラッパーである。これは同じ引数にたいする複数回の検査に必要なのが、1回のfunction呼び出しだけであることを意味する。これは外部プロセス呼び出しなど、処理が低速のとき有用かもしれない。