Previous: , Up: Completion   [Contents][Index]


19.6.8 通常バッファーでの補完

補完は通常はミニバッファー内で行われますが、補完機能は通常のEmacsバッファー内のテキストにも使用できます。多くのメジャーモードで、コマンドC-M-iまたはM-TABによってバッファー内補完が行われ、それらはcompletion-at-pointにバインドされています。Symbol Completion in The GNU Emacs Manualを参照してください。このコマンドはアブノーマルフック変数completion-at-point-functionsを使用します:

Variable: completion-at-point-functions

このアブノーマルフックの値は関数のリストである。これらの関数はポイント位置のテキストの補完にたいする補完テーブルの計算に使用される。これはメジャーモードによるモード特有な補完テーブル(Major Mode Conventionsを参照)の提供に使用できる。

コマンドcompletion-at-pointが実行されると、引数なしでリスト内の関数が1つずつ呼び出される。それぞれの関数はポイント位置のテキストにたいして補完テーブルを生成できないならnilをリターンする。生成できたら以下の形式のリストをリターンする

(start end collection . props)

ここでstartendは補完する(ポイントを取り囲む)テキストの区切りである。collectionはそのテキストを補完する補完テーブルであり、try-completion (Basic Completionを参照)の2つ目の引数として渡すのに適した形式である。補完候補はcompletion-styles (Completion Variablesを参照)で定義された補完スタイルを通じて、この補完テーブルを通常の方法で使用して生成されるだろう。propsは追加の情報のためのプロパティリストである。completion-extra-properties内のすべてのプロパティ(Completion Variablesを参照)と、以下の追加のプロパティが認識される:

:predicate

値は補完候補が満足する必要がある述語。

:exclusive

値がnoの場合は、もし補完テーブルがポイント位置のテキストのマッチに失敗したなら、補完の失敗を報告するかわりにcompletion-at-pointcompletion-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バッファー内の任意に拡張されたテキストにたいして便利な補完方法を提供します:

Function: completion-in-region start end collection &optional predicate

この関数はcollectionを使用してカレントバッファー内の位置startendの間のテキストを補完する。引数collectiontry-completion (Basic Completionを参照)のときと同じ意味をもつ。

この関数は補完テキストを直接カレントバッファーに挿入する。completing-read (Minibuffer Completionを参照)とは異なり、ミニバッファーをアクティブにしない。

この関数が機能するためには、ポイントがstartendの間になければならない。