ドキュメンテーション
関数のポイントでのAPIの完了は、 completion-at-point-functions
このフックの各関数は引数なしで順番に呼び出され、その時点で適用できないことを意味するnilを返すか、補完を実行するための引数のない関数(推奨)、またはフォームのリスト(START END COLLECTION 。PROPS)STARTおよびENDはエンティティを区切るためのポイントであり、ポイントを含める必要があります。COLLECTIONはエンティティを完了するために使用する完了テーブルで、PROPSは追加情報のプロパティリストです。
start
、end
そしてprops
明白ですが、の形式がcollection
適切に定義されていないと思います。そのためには、try-completion
またはのドキュメントを見ることができますall-completions
COLLECTIONがalistの場合、キー(要素の車)は可能な補完です。要素がコンスセルでない場合、要素自体が補完候補になります。COLLECTIONがハッシュテーブルである場合、文字列またはシンボルであるすべてのキーが補完候補になります。COLLECTIONがオブジェクト配列の場合、オブジェクト配列内のすべてのシンボルの名前が補完候補になります。
COLLECTIONは、補完自体を実行する関数にすることもできます。これは、値STRING、PREDICATE、nilの3つの引数を受け取ります。それが返すものはすべて「try-completion」の値になります。
例
以下は/etc/dictionaries-common/words
、バッファ内の単語を完成させるためにで定義された単語を使用するポイントでの補完の簡単な例です
(defvar words (split-string (with-temp-buffer
(insert-file-contents-literally "/etc/dictionaries-common/words")
(buffer-string))
"\n"))
(defun words-completion-at-point ()
(let ((bounds (bounds-of-thing-at-point 'word)))
(when bounds
(list (car bounds)
(cdr bounds)
words
:exclusive 'no
:company-docsig #'identity
:company-doc-buffer (lambda (cand)
(company-doc-buffer (format "'%s' is defined in '/etc/dictionaries-common/words'" cand)))
:company-location (lambda (cand)
(with-current-buffer (find-file-noselect "/etc/dictionaries-common/words")
(goto-char (point-min))
(cons (current-buffer) (search-forward cand nil t))))))))
補完関数は、ある時点で単語を検索し(ライブラリthingatpt
は単語の境界を見つけるために使用されます)、/etc/dictionaries-common/words
ファイル内の単語に対してそれを補完します。このプロパティ:exclusive
はno
、失敗した場合にemacsが他のcapf関数を使用できるように設定されます。最後に、会社モードの統合を強化するためにいくつかの追加プロパティが設定されています。
パフォーマンス
私のシステムの単語ファイルには99171エントリがあり、emacsは問題なくそれらを完了することができたので、15000エントリは問題にならないと思います。
会社モードとの統合
会社モードcompletion-at-point-functions
はcompany-capf
バックエンドの使用と非常によく統合されているため、そのまま使用できますがprops
、capf関数の結果に追加で返すことで、会社が提供する補完を強化できます。現在サポートされている小道具は
:company-doc-buffer
-現在の候補者のメタデータを表示するために会社が使用
:company-docsig
-ミニバッファーで候補者に関するメタデータをエコーするために会社が使用
:company-location
-現在の候補者の場所にジャンプするために会社によって使用されます