GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Basic-Completion.html ・ emacs-doc.conao3.com

21.6.1 基本的な補完機能

以下の補完機能は、それ自体はミニバッファとは無関係です。ミニバッファを利用する上位レベルの補完機能の近くに配置するため、ここで説明します。

関数: try-completion string collection &optional predicate

この関数は、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"
関数: all-completions string collection &optional predicate

この関数は、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")
関数: test-completion string collection &optional predicate

この関数は、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 が順に返します。

関数: completion-boundaries string collection predicate suffix

この関数は、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 以外のプロパティを指定して、その変数をリスクありとしてマークしてください。ファイルローカル変数を参照してください。

変数: completion-ignore-case

この変数の値が nil 以外の場合、補完において大文字・小文字は区別されません。read-file-name の範囲内では、この変数は read-file-name-completion-ignore-case によって上書きされます(ファイル名の読み取り を参照)。read-buffer の範囲内では、read-buffer-completion-ignore-case によって上書きされます(高レベル補完関数 を参照)。

変数: completion-regexp-list

これは正規表現の一覧です。補完機能では、case-fold-search(検索と大文字小文字を参照)をcompletion-ignore-caseの値にバインドした状態で、この一覧にあるすべての正規表現に一致する場合にのみ、補完が許容されます。

この変数にグローバルにnil以外の値を設定しないでください。安全ではなく、補完コマンドでエラーが発生する可能性が高いためです。この変数は、基本的な補完関数(try-completion、test-completion、all-completions)の呼び出し周辺においてのみ、nil以外の値にlet-bindしてください。

マクロ: lazy-completion-table var fun

このマクロは、変数 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 は、終端文字列を追加します。