補完は通常ミニバッファで行われますが、補完機能は通常のEmacsバッファ内のテキストに対しても利用可能です。多くのメジャーモードでは、バッファ内での補完はcompletion-at-pointにバインドされたC-M-iまたはM-TABコマンドによって行われます。The GNU Emacs
ManualのSymbol
Completionを参照してください。このコマンドは、異常フック変数completion-at-point-functionsを使用します:
この異常なフックの値は、ポイントにあるテキストを補完するための補完テーブル(基本補完関数を参照)を計算するために使用される関数のリストである必要があります。メジャーモードでは、モード固有の補完テーブルを提供するためにこれを利用できます(メジャーモードの規約を参照)。
コマンド completion-at-point
が実行されると、リスト内の関数が引数なしで順次呼び出されます。各関数は、ポイント位置にあるテキストの完了データについて責任を負うことができ、かつそうしたい場合を除き、nil を返す必要があります。それ以外の場合は、以下の形式のリストを返す必要があります:
(start end collection . props)
start と end
は、テキストを補完するための範囲を区切ります(この範囲にはポイントが含まれる必要があります)。collection は、そのテキストを補完するための補完テーブルであり、try-completion の第2引数として渡すのに適した形式になっています(基本補完関数を参照)。補完の候補は、この補完テーブルから、completion-styles で定義された補完スタイルを介して、通常の方法で生成されます(補完変数を参照)。props は追加情報のプロパティリストであり、completion-extra-properties に含まれるプロパティのいずれか(補完変数を参照)に加え、以下の追加プロパティも認識されます:
:predicate値は、完了候補が満たす必要がある述語とするべきです。
:exclusive値が no の場合、完了テーブルがポイント位置のテキストと一致しなかったとき、completion-at-point は完了失敗を報告する代わりに、completion-at-point-functions の次の関数へと進みます。
このフックの関数は、非常に頻繁に呼び出される可能性があるため(例:post-command-hook
から)、原則として速やかに処理を終了させる必要があります。補完リストの生成がコストの高い処理である場合は、collection に関数を指定することを強く推奨します。Emacs は内部的に completion-at-point-functions の関数を何度も呼び出すことがありますが、collection の値を参照するのはその一部の呼び出しのみです。collection に関数を指定することで、Emacs
は必要なタイミングまで補完の生成を遅延させることができます。completion-table-dynamic を使用してラッパー関数を作成できます:
;; Avoid this pattern.
(let ((beg ...) (end ...) (my-completions (my-make-completions)))
(list beg end my-completions))
;; Use this instead.
(let ((beg ...) (end ...))
(list beg
end
(completion-table-dynamic
(lambda (_)
(my-make-completions)))))
さらに、collection は原則として start と
end
の間の現在のテキストに基づいて事前フィルタリングされるべきではありません。というのも、使用する補完スタイルに応じてそれを行うのは、completion-at-point-functions の呼び出し元の責務だからです。
completion-at-point-functions
の関数は、前述のようにリストではなく関数を返すこともあります。その場合、返された関数は引数なしで呼び出され、補完処理の実行をすべてその関数が担います。このような使い方は推奨しません。これは、古いコードを
completion-at-point
を使用するように移行するのを支援することのみを目的としたものです。
completion-at-point-functions 内で nil 以外の値を返す最初の関数は、completion-at-point で使用されます。残りの関数は呼び出されません。ただし、前述の通り
:exclusive の指定がある場合はこの限りではありません。
以下の関数を使用すると、Emacsバッファ内の任意のテキスト範囲に対して便利な方法で補完を行うことができます。
この関数は、現在のバッファ内の start と end
の間にあるテキストを、collection を用いて補完します。引数 collection は try-completion
と同じ意味を持ちます(基本的な補完関数
を参照してください)。
この関数は、補完テキストを現在のバッファに直接挿入します。completing-read(補完とミニバッファを参照)とは異なり、ミニバッファを起動することはありません。
この関数が動作するには、pointがstartとendの間にある必要があります。