補完コマンドは、考えられる補完候補の膨大なリストを、ミニバッファに入力した内容に一致するより小さなサブセットへと絞り込むことで動作します。補完の例では、このようなマッチングの簡単な例を挙げました。何をもってマッチングとするかを決定する手順は非常に複雑です。Emacsは、ほとんどの状況において、妥当な補完候補を提示しようとします。
Emacsは、1つ以上の補完スタイル—ミニバッファのテキストを補完候補と照合するための基準セット—を用いて補完を行います。補完処理中、Emacsは各補完スタイルを順に試行します。あるスタイルで1つ以上の一致が見つかった場合、それが補完候補のリストとして採用されます。あるスタイルで一致が見つからなかった場合、Emacsは次のスタイルへと移ります。
リスト変数 completion-styles
は、使用する補完スタイルを指定します。各リスト要素は、補完スタイルの名前(Lispシンボル)か、あるいは補完スタイルの名前で始まり、その後にその補完スタイルで適用される
let 形式のバインディングリストが続くリストのいずれかです。completion-styles
の複数の要素で、異なる変数バインディングを用いて同一の補完スタイルを指定できます。
利用可能なスタイルシンボルは、変数 completion-styles-alist
に格納されています(The Emacs Lisp Reference Manual の Completion
Variables を参照)。デフォルトの補完スタイルは(順に)以下の通りです:
basic ¶一致する補完候補は、ミニバッファのポイント位置より前のテキストと同じ先頭部分を持つ必要があります。さらに、ポイント位置より後にミニバッファ内にテキストがある場合、補完候補の残りの部分はそのテキストを部分文字列として含まなければなりません。
partial-completion ¶このアグレッシブな補完スタイルでは、ミニバッファのテキストをハイフンやスペースで区切られた単語に分割し、各単語を個別に補完します。(例えば、コマンド名を補完する場合、‘em-l-m’は‘emacs-lisp-mode’に補完されます。)
さらに、ミニバッファのテキスト内の「*」はワイルドカードとして扱われます――補完候補の対応する位置にある任意の文字列に一致します。
completion-pcm-leading-wildcard が t に設定されている場合、このスタイルは substring
スタイルと同様に、ミニバッファのテキスト内の各単語の先頭に ワイルドカード
が存在するかのように常に動作します。例えば、‘l-ode’ は
‘emacs-lisp-mode’ に補完されます。
emacs22 ¶この補完スタイルは basic
に似ていますが、ポイント以降のミニバッファ内のテキストを無視する点が異なります。Emacs 22
の補完動作に対応しているため、このように命名されています。
以下の追加の完了スタイルも定義されており、必要に応じて completion-styles
に追加することができます(カスタマイズ
を参照してください):
substring ¶マッチング補完候補には、ポイント前のミニバッファ内のテキストと、ポイント後のミニバッファ内のテキストが、部分文字列として(同じ順序で)含まれている必要があります。
したがって、ミニバッファ内のテキストが ‘foobar’ で、ポイントが ‘foo’ と ‘bar’ の間にある場合、それは ‘afoobbarc’ にマッチします。ここで a、b、c は、空文字列を含む任意の文字列となり得ます。
flex ¶flx、fuzzy、またはscatter補完としても知られるこのアグレッシブな補完方式は、順序通りの部分文字列を用いて補完を試みます。例えば、‘foo’が‘frodo’や‘fbarbazoo’にマッチするかどうかを検討します。
initials ¶この非常にアグレッシブな補完スタイルは、頭字語やイニシャリズムを補完しようとします。例えば、コマンド名を補完する際、‘lch’ を ‘list-command-history’ にマッチさせます。
また、emacs21
という非常にシンプルな補完スタイルもあります。このスタイルでは、ミニバッファ内のテキストが ‘foobar’ の場合、‘foobar’ で始まるマッチのみが考慮されます。
変数 completion-category-overrides
を設定することで、状況に応じて異なる補完スタイルを使い分けることができます。例えば、デフォルト設定では、バッファ名に対して basic と substring
の補完のみを使用するようになっています。