Next: 補完とミニバッファー, Up: 補完 [Contents][Index]
以下の補完関数は、その関数自身ではミニバッファーで何も行いません。ここではミニバッファーを使用する高レベルの補完機能とともに、これらの関数について説明します。
この関数はcollection内のstringに可能なすべての補完の共通する最長部分文字列をリターンする。
collectionは補完テーブル(completion table)と呼ばれる。値は文字列リスト、コンスセル、obarray、ハッシュテーブル、または補完関数でなければならない。
try-completion
は補完テーブルにより指定された許容できる補完それぞれにたいして、stringと比較を行う。許容できる補完マッチが存在しなければnil
をリターンする。マッチする補完が1つだけで、それが完全一致ならばt
をリターンする。それ以外は、すべてのマッチ可能な補完に共通する最長の初期シーケンスをリターンする。
collectionがリストなら、許容できる補完(permissible
completions)はそのリストの要素によって指定される。リストの要素は文字列、またはCARが文字列、または(symbol-name
によって文字列に変換される)シンボルであるようなコンスセルである。リストに他の型の要素が含まれる場合は無視される。
collectionがobarray(シンボルの作成とinternを参照)なら、そのobarray内のすべてのシンボル名が許容できる補完セットを形成する。
collectionがハッシュテーブルの場合には、文字列かシンボルのキーが利用可能な補完となる。他のキーは無視される。
collectionとして関数を使用することもできる。この場合にはその関数だけが補完を処理する役目を担う。つまりtry-completion
は、この関数が何をリターンしようともそれをリターンする。この関数はstring、predicate、nil
の3つの引数で呼び出される(3つ目の引数は同じ関数をall-completions
でも使用して、どちらの場合でも適切なことを行うため)。プログラムされた補完を参照のこと。
引数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
はそれをリターンする。プログラムされた補完を参照のこと。
以下の例は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"
の前にある領域に関する補完情報だけをリターンするであろうことを告げている。try-completion
は意味のある境界に影響されない。すなわち"/usr/sh"
にたいしてtry-completion
は"share/"
ではなく、依然として"/usr/share/"
をリターンする。
補完alistを変数に格納した場合は、変数のrisky-local-variable
プロパティに非nil
をセットして、その変数がrisky(危険)だとマークすること。ファイルローカル変数を参照のこと。
この変数の値が非nil
なら、補完でのcase(大文字小文字)の違いは意味をもたない。read-file-name
では、この変数はread-file-name-completion-ignore-case
(ファイル名の読み取りを参照)にオーバーライドされる。read-buffer
では、この変数はread-buffer-completion-ignore-case
(高レベルの補完関数を参照)にオーバーライドされる。
これは正規表現のリストである。補完関数はこのリスト内のすべての正規表現にマッチした場合のみ許容できる補完と判断する。case-fold-search
(検索と大文字小文字を参照)ではcompletion-ignore-case
の値にバインドされる。
この変数にグローバルに非nil
をセットしてはならない。安全ではないし恐らく補完コマンドでエラーが発生するだろう。この変数への非nil
値のバインドはtry-completion
、test-completion
、all-completions
といった基本的な補完コマンド呼び出しの前後においてletでのみバインドを行う必要がある。
この変数は変数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)を追加します。
Next: 補完とミニバッファー, Up: 補完 [Contents][Index]