Next: , Previous: Completion, Up: Completion


19.5.1 基本補完関数

2つの関数try-completionall-completionsは、 それ自身ではミニバッファを使いません。 これらについて本章で述べるのは、 ミニバッファを使う上位レベルの補完機能と同列にしておくためです。

— Function: try-completion string collection &optional predicate

この関数は、collectionにあるstringを補完する 共通の最長な部分文字列を返す。 collectionの値は、連想リスト、オブジェクト配列、あるいは、 実質的な文字列の集まりを返す関数(下記参照)であること。

補完では、collectionで指定した各補完候補と stringを比較する。 補完候補の先頭部分がstringに等しければ、 その補完候補は一致するという。 一致する補完候補がなければ、try-completionnilを返す。 たった1つの補完候補に一致し、かつ、完全に一致すれば、 try-completiontを返す。 さもなければ、一致する補完候補すべてに共通する最長の文字列を値とする。

collectionが連想リスト(see Association Lists)であると、 連想リストの要素のcar群が補完候補の集まりになる。

collectionがオブジェクト配列(see Creating Symbols)であると、 オブジェクト配列内のすべてのシンボルの名前が補完候補の集まりになる。 グローバル変数obarrayは、インターンしたすべてのLispシンボルの 名前を収めたオブジェクト配列を保持する。

新たなオブジェクト配列を作成する唯一の正しい方法は、 まず空で作成してからinternで1つ1つシンボルを追加することである ことに注意。 なお、1つのシンボルを複数のオブジェクト配列にはインターンできない。

引数predicatenil以外である場合、 それは1引数の関数であること。 その関数は一致する補完候補の検査に使われ、 predicatenil以外を返す場合にのみ一致した候補とみなす。 predicateに渡す引数は、 (carが文字列である)連想リストのコンスセルであるか、 オブジェクト配列からの(シンボル名ではない)シンボルである。

collectionには、関数であるシンボルを使うこともできる。 その関数には補完処理を完遂する責任がある。 try-completionはその関数が返したものを返す。 その関数は3引数、つまり、 stringpredicatenilで呼ばれる。 (第3引数がある理由は、 all-completionsでも同じ関数を使い、 いずれの場合にも適切に動作できるようにするため。) see Programmed Completion

以下の最初の例では、 文字列‘foo’は連想リストの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"
— Function: all-completions string collection &optional predicate nospace

この関数はstringの補完すべてのリストを返す。 この関数の引数は、try-completionのものと同じである。

collectionが関数であると、 stringpredicatetの3引数で呼ばれる。 all-completionsはこの関数が返す値を返す。 see Programmed Completion

nospacenil以外であると、 stringが空白で始まらない限り、空白で始まる補完は無視する。

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")
— Variable: completion-ignore-case

この変数の値がnil以外であると、 Emacsは補完において大文字小文字を区別しない。