以下の補完機能は、それ自体はミニバッファとは無関係です。ミニバッファを利用する上位レベルの補完機能の近くに配置するため、ここで説明します。
この関数は、collection における string の考えられるすべての補完の中で、最長の共通部分文字列を返します。
collection は 補完テーブル と呼ばれます。その値は、文字列またはコンスセルのリスト、オブアレイ、ハッシュテーブル、あるいは補完関数である必要があります。
try-completion は、string
を完了テーブルで指定された許容される完了候補のそれぞれと照合します。一致する許容される完了候補がない場合は、nil を返します。一致する完了候補が1つのみあり、かつそれが完全一致である場合は、t を返します。それ以外の場合は、一致する可能性のあるすべての完了候補に共通する最長の先頭シーケンスを返します。
collection
がリストである場合、許容される補完内容はリストの要素によって指定され、各要素は文字列、または CAR
が文字列もしくはシンボルであるコンスセルのいずれかである必要があります(シンボルは symbol-name
を用いて文字列に変換されます)。リストにそれ以外の型の要素が含まれている場合は、それらは無視されます。
collection が obarray である場合(シンボルの作成とインターニングを参照)、その obarray 内のすべてのシンボル名が、許容される補完候補となります。
collection がハッシュテーブルである場合、文字列またはシンボルであるキーが補完候補となります。それ以外のキーは無視されます。
また、関数を collection
として使用することもできます。この場合、関数が補完処理を単独で担い、try-completion
はその関数が返す値をそのまま返します。関数には string、predicate、nil
の3つの引数が渡されます(3番目の引数は、all-completions
でも同じ関数を使用し、いずれの場合においても適切な処理を行えるようにするためのものです)。プログラムによる補完 を参照してください。
引数 predicate が nil
でない場合、それは1つの引数を取る関数でなければなりません。ただし、collection
がハッシュテーブルである場合は、2つの引数を取る関数である必要があります。これは考えられる各マッチを判定するために使用され、predicate が nil
以外を返す場合にのみ、マッチが受理されます。predicate に渡される引数は、alist
からの文字列またはコンスセル(その CAR が文字列であるもの)、あるいは obarray
からのシンボル(シンボル名ではないもの)のいずれかです。collection がハッシュテーブルである場合、predicate
は文字列のキーとそれに関連付けられた値という2つの引数で呼び出されます。
さらに、受理されるためには、完了形はcompletion-regexp-list内のすべての正規表現にも一致しなければなりません。(ただし、collectionが関数である場合は、その関数がcompletion-regexp-list自体を処理する必要があります。)
以下の例の1つ目では、文字列 ‘foo’ がアリスト CAR のうち3つにマッチします。すべてのマッチは文字 ‘fooba’
から始まるため、この結果となります。2つ目の例では、考えられるマッチは1つのみであり、かつ完全一致であるため、戻り値は t となります。
(try-completion
"foo"
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
⇒ "fooba"
(try-completion "foo" '(("barfoo" 2) ("foo" 3)))
⇒ t
以下の例では、多くの記号が文字 ‘forw’ で始まり、それらはすべて ‘forward’ という単語で始まっています。ほとんどの記号では、その後に ‘-’ が続きますが、すべてがそうであるわけではないため、‘forward’ までしか完成しません。
(try-completion "forw" obarray)
⇒ "forward"
最後に、以下の例では、考えられる3つのマッチのうち2つのみが述語 test を満たします(文字列
‘foobaz’ は短すぎます)。これらはいずれも文字列
‘foobar’ で始まっています。
(defun test (s)
(> (length (car s)) 6))
⇒ test
(try-completion
"foo"
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
'test)
⇒ "foobar"
この関数は、string の考えられるすべての補完候補のリストを返します。この関数の引数は try-completion のものと同じであり、try-completion と同様に completion-regexp-list を利用します。
collection が関数である場合、string、predicate、t の3つの引数で呼び出され、all-completions
はその関数が返す値をそのまま返します。プログラムによる補完を参照してください。
以下に、try-completionの例で示した関数testを用いた例を挙げます。
(defun test (s)
(> (length (car s)) 6))
⇒ test
(all-completions
"foo"
'(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
'test)
⇒ ("foobar1" "foobar2")
この関数は、string が collection および
predicate によって指定された有効な補完候補である場合、non-nil を返します。引数は try-completion
と同様です。例えば、collection が文字列のリストである場合、string がそのリストに含まれ、かつ predicate
が満たされていれば、この条件は成立します。
この関数は、try-completionと同様にcompletion-regexp-listを使用します。
predicate が nil ではなく、かつ
collection に completion-ignore-case に従って compare-strings で判定される互いに等しい文字列が複数含まれている場合、predicate はそれらのすべて、あるいはいずれも受け付けるべきである。そうでない場合、test-completion の戻り値は実質的に予測不能となる。
collection が関数である場合、string、predicate、lambda の3つの引数で呼び出され、それが返す値を test-completion が順に返します。
この関数は、string がポイント前のテキストを、suffix がポイント後のテキストを保持していると想定して、collection が動作するフィールドの境界を返します。
通常、補完は文字列全体に対して行われるため、すべての通常のコレクションにおいて、これは常に (0
. (length suffix))
を返します。しかし、ファイルに対する補完のようなより複雑な補完は、フィールドごとに行われます。例えば、"/usr/sh" の補完では、"/usr/share/doc" が存在していても、"/usr/share/" は含まれますが "/usr/share/doc" は含まれません。また、"/usr/sh" に対する all-completions では、"/usr/share/" は含まれず、"share/" のみが含まれます。したがって、string が "/usr/sh" で
suffix が "e/doc"
である場合、completion-boundaries は (5 . 1) を返します。これにより、collection は "/usr/"
の後かつ "/doc"
の前の領域に関する補完情報のみを返すことがわかります。try-completion
は非自明な境界の影響を受けません。例えば、"/usr/sh" に対する
try-completion は、"share/" ではなく "/usr/share/" を返す場合があります。
補完リストを変数に格納する場合は、nil risky-local-variable
以外のプロパティを指定して、その変数をリスクありとしてマークしてください。ファイルローカル変数を参照してください。
この変数の値が nil 以外の場合、補完において大文字・小文字は区別されません。read-file-name の範囲内では、この変数は read-file-name-completion-ignore-case によって上書きされます(ファイル名の読み取り を参照)。read-buffer の範囲内では、read-buffer-completion-ignore-case によって上書きされます(高レベル補完関数 を参照)。
これは正規表現の一覧です。補完機能では、case-fold-search(検索と大文字小文字を参照)をcompletion-ignore-caseの値にバインドした状態で、この一覧にあるすべての正規表現に一致する場合にのみ、補完が許容されます。
この変数にグローバルにnil以外の値を設定しないでください。安全ではなく、補完コマンドでエラーが発生する可能性が高いためです。この変数は、基本的な補完関数(try-completion、test-completion、all-completions)の呼び出し周辺においてのみ、nil以外の値にlet-bindしてください。
このマクロは、変数 var を補完用のコレクションとして遅延的に初期化し、実際に必要となるまでその内容を計算しない仕組みを提供します。このマクロを使用して値を生成し、それを var に格納します。適切な値の実際の計算は、var を用いて初めて補完を行う際に行われます。これは、引数なしで fun を呼び出すことで実行されます。fun が返す値が、var の永続的な値となります。
以下に例を示します。
(defvar foo (lazy-completion-table foo make-my-alist))
既存の補完テーブルを受け取り、修正したバージョンを返す関数がいくつかあります。completion-table-case-fold は大文字小文字を区別しないテーブルを返します。completion-table-in-turn と completion-table-merge は、複数の入力テーブルをさまざまな方法で結合します。completion-table-subvert
は、異なる先頭プレフィックスを使用するようにテーブルを変更します。completion-table-with-quoting
は、引用符で囲まれたテキストの処理に適したテーブルを返します。completion-table-with-predicate
は、述語関数を用いてテーブルをフィルタリングします。completion-table-with-terminator は、終端文字列を追加します。