Previous: Programmed Completion, Up: Completion [Contents][Index]
補完は通常はミニバッファー内で行われますが、補完機能は通常のEmacsバッファー内のテキストにも使用できます。多くのメジャーモードで、コマンドC-M-iまたはM-TABによってバッファー内補完が行われ、それらはcompletion-at-point
にバインドされています。Symbol
Completion in The GNU Emacs
Manualを参照してください。このコマンドはアブノーマルフック変数completion-at-point-functions
を使用します:
このアブノーマルフックの値は関数のリストである。これらの関数はポイント位置のテキストの補完にたいする補完テーブルの計算に使用される。これはメジャーモードによるモード特有な補完テーブル(Major Mode Conventionsを参照)の提供に使用できる。
コマンドcompletion-at-point
が実行されると、引数なしでリスト内の関数が1つずつ呼び出される。それぞれの関数はポイント位置のテキストにたいして補完テーブルを生成できないならnil
をリターンする。生成できたら以下の形式のリストをリターンする
(start end collection . props)
ここでstartとendは補完する(ポイントを取り囲む)テキストの区切りである。collectionはそのテキストを補完する補完テーブルであり、try-completion
(Basic Completionを参照)の2つ目の引数として渡すのに適した形式である。補完候補はcompletion-styles
(Completion Variablesを参照)で定義された補完スタイルを通じて、この補完テーブルを通常の方法で使用して生成されるだろう。propsは追加の情報のためのプロパティリストである。completion-extra-properties
内のすべてのプロパティ(Completion Variablesを参照)と、以下の追加のプロパティが認識される:
:predicate
値は補完候補が満足する必要がある述語。
:exclusive
値がno
の場合は、もし補完テーブルがポイント位置のテキストのマッチに失敗したなら、補完の失敗を報告するかわりにcompletion-at-point
はcompletion-at-point-functions
内の次の関数へ移動する。
補完リスト生成が処理が高価なら、collectionにたいして関数の提供を推奨する。Emacsは内部的にcompletion-at-point-functions
内の関数を多数回呼び出すかもしれないが、それらの呼び出しのいくつかにたいしてのみcollectionの値を考慮する。collectionにたいして関数を提供することにより、Emacsは必要になるまで補完の生成を遅延できる。ラッパー関数を作成するためにcompletion-table-dynamicを使用できる:
;; このパターンは避けて (let ((beg ...) (end ...) (my-completions (my-make-completions))) (list beg end my-completions)) ;; かわりに以下を使用する (let ((beg ...) (end ...)) (list beg end (completion-table-dynamic (lambda (_) (my-make-completions)))))
completion-at-point-functions
内の関数も、上述したリストのかわりに関数をリターンするかもしれない。その場合は引数なしでリターンされた関数が呼び出されてその関数が補完処理の全責任を負う。この方法は推奨されない。これはcompletion-at-point
を使用する古いコードの救済を意図したものだからである。
非nil
値を最初にリターンしたcompletion-at-point-functions
内の関数が、completion-at-point
によって使用される。残りの関数は呼び出されない。例外は上述の:exclusive
指定があるとき。
以下の関数はEmacsバッファー内の任意に拡張されたテキストにたいして便利な補完方法を提供します:
この関数はcollectionを使用してカレントバッファー内の位置startとendの間のテキストを補完する。引数collectionはtry-completion
(Basic Completionを参照)のときと同じ意味をもつ。
この関数は補完テキストを直接カレントバッファーに挿入する。completing-read
(Minibuffer Completionを参照)とは異なり、ミニバッファーをアクティブにしない。
この関数が機能するためには、ポイントがstartとendの間になければならない。