Next: Minibuffer Completion, Up: Completion [Contents][Index]
以下の補完関数は、その関数自身ではミニバッファーでなにも行いません。ここでは、ミニバッファーを使用する高レベルの補完機能と並べて、これらの関数について説明します。
この関数はcollection内のstringに利用可能なすべての補完の、共通する最長部分文字列をリターンする。
collectionは補完テーブル(completion table)と呼ばれる。値は文字列リスト、コンスセル、obarray、ハッシュテーブル、または補完関数でなければならない。
try-completion
は補完テーブルにより指定された許容できる補完それぞれにたいして、stringと比較を行う。許容できる補完マッチが存在しない場合は、nil
をリターンする。マッチする補完が1つだけで、それが完全一致ならばt
をリターンする。それ以外は、すべてのマッチ可能な補完に共通する最長の初期シーケンス(longest
initial sequence)をリターンする。
collectionがリストの場合、許容できる補完(permissible
completions)はそのリストの要素により指定される。リストの要素は文字列、またはCARが文字列または(symbol-name
により文字列に変換される)シンボルであるようなコンスセルである。リストに他の型の要素が含まれる場合は無視される。
collectionがobarray(Creating Symbolsを参照)の場合、そのobarray内のすべてのシンボル名が許容できる補完セットを形成する。
collectionがハッシュテーブルの場合には、文字列のキーが利用可能な補完(possible completions)になる。他のキーは無視される。
collectionとして関数を使用することもできる。この場合、この関数だけが補完を処理する役目を担う。つまりtry-completion
は、この関数が何をリターンしようとも、それをリターンする。この関数はstring、predicate、nil
の3つの引数で呼び出される(3つ目の引数は同じ関数をall-completions
でも使用して、どちらの場合でも適切なことを行うためである)。Programmed Completionを参照のこと。
引数predicateが非nil
の場合、collectionがハッシュテーブルなら1引数、それ以外は2引数の関数でなければならない。これは利用可能なマッチのテストに使用され、マッチはpredicateが非nil
をリターンしたときだけ受け入れられる。predicateに与えられる引数は文字列、alistのコンスセル(CARが文字列)、またはobarrayのシンボル(シンボル名ではない)のうちのどれか。collectionがハッシュテーブルの場合、predicateは文字列キー(string
key)と関連値(associated value)の2引数で呼び出される。
加えて使いやすいように、補完はcompletion-regexp-list
内のすべての正規表現にもマッチしなければならない。(collectionが関数の場合は、その関数自身がcompletion-regexp-list
を処理する必要がある。)
以下の例の1つ目では、文字列‘foo’がalistのうち3つのCARとマッチされている。すべてのマッチは文字‘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"
最後に、以下の例では述語test
に渡される利用可能なマッチは3つのうち2つだけである(文字列‘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
はそれをリターンする。Programmed Completionを参照のこと。
以下の例は、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で指定された有効な補完候補の場合は、nil
をリターンする。引数はtry-completion
の引数と同じ。たとえば、collectionが文字列リストの場合は、stringがリスト内に存在し、かつpredicateを満足すればtrueとなる。
この関数はtry-completion
が行うのと同じ方法で、completion-regexp-list
を使用する。
predicateが非nil
で、collectionが同じ文字列を複数含む場合には、completion-ignore-case
にしたがってcompare-strings
で判定して、それらすべてをリターンするか、もしくは何もリターンしない。それ以外では、test-completion
のリターン値は基本的に予測不可能である。
collectionが関数の場合はstring、predicate、lambda
の3つの引数で呼び出される。それが何をリターンするにせよ、test-completion
はそれをリターンする。
この関数はポイントの前のテキストがstring、ポイントの後がsuffixと仮定して、collectionが扱うフィールドの境界(boundary)をリターンする。
補完は通常、文字列(string)全体に作用するので、すべての普通のコレクション(collection)にたいして、この関数は常に(0
. (length
suffix))
をリターンするだろう。しかしファイルにたいする補完などのより複雑な補完は、1回に1フィールド行われる。たとえば、たとえ"/usr/share/doc"
が存在しても、"/usr/sh"
の補完に"/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"
の前にある領域に関する補完情報だけをリターンするであろうことを告げている。
補完alistを変数に格納した場合は、変数のrisky-local-variable
プロパティに非nil
をセットして、その変数が“risky(危険)”だとマークすべきである。File Local Variablesを参照のこと。
この変数の値が非nil
の場合、補完での大文字小文字の違いは意味をもたない。read-file-name
では、この変数はread-file-name-completion-ignore-case
(Reading File Namesを参照)にオーバーライドされる。read-buffer
では、この変数はread-buffer-completion-ignore-case
(High-Level Completionを参照)にオーバーライドされる。
これは正規表現のリストである。補完関数はこのリスト内のすべての正規表現にマッチした場合のみ許容できる補完と判断する。case-fold-search
(Searching and Caseを参照)ではcompletion-ignore-case
の値にバインドされる。
この変数は変数varを補完のためのcollectionとしてlazy(lazy: 力のない、だらけさせる、のろのろした、怠惰な、不精な、眠気を誘う)な方法で初期化する。ここでlazyとは、collection内の実際のコンテンツを必要になるまで計算しないという意味。このマクロはvarに格納する値の生成に使用する。varを使用して最初に補完を行ったとき、真の値が実際に計算される。これは引数なしでfunを呼び出すことにより行われる。funがリターンする値は、varの永続的な値となる。
以下は例である:
(defvar foo (lazy-completion-table foo make-my-alist))
既存の補完テーブルを受け取り変更したバージョンをリターンする関数が、いくつかあります。completion-table-case-fold
は大文字小文字を区別しない、case-insensitiveなテーブルをリターンします。completion-table-in-turn
とcompletion-table-merge
は、複数の入力テーブルを、異なる方法で組み合わせます。completion-table-subvert
はテーブルを異なる初期プレフィックス(initial
prefix)で変更します。completion-table-with-quoting
はクォートされたテキストの処理に適したテーブルをリターンします。completion-table-with-predicate
は述語関数(predicate
function)によりフィルターします。completion-table-with-terminator
は終端文字列(terminating
string)を追加します。