company 20170617.1502(in MELPA)
Modular text completion framework

概要

company.el は一言で言うとEmacs版 IntelliSense (インテリセンス) です。

キーをタイプした時点で自動的に補完候補が出てきて、
ミスタイプを減らして入力効率を上げる優れた 補完機能 です。

同種のものに日本では auto-complete.el が有名ですが、
company.elの方が先に登場しています。

2年前に Dmitry Gutov 氏が原作者 Nikolaj Schumacher 氏から
メンテナを引き継ぎだ後、とても活発に開発されています。

MELPAのRSSを見ていてもかなり更新が目立っているので取り上げました。

auto-completeと性能的にはほぼ互角という印象ですが、
ソースコードが短く、独自の補完関数が関数1つで書ける手軽さが
company.elの魅力です。

デフォルトでは自動的に補完候補がポップアップしますが、

(setq company-idle-delay nil)

を指定すると手動補完になり、 M-x company-complete で補完します。

どのように補完するかは
(auto-completeでいうsource、companyではbackend)
company-backends 変数で指定します。

個人的にはあまりにも頻繁に自動補完がポップアップするのは煩わしいので、
自動補完は限られた場面のみで、手動補完をメインに使っていきたいです。

自動補完はついつい忘れがちなもの…
たとえば ドメイン特化言語 の語彙だったり、
yasnippet の略語に使いたいところです。

デフォルトではファイル名も自動補完されるので、
ファイル数が多いディレクトリで固まることもあります。

どうあれ、奥が深いパッケージなので
時間かけて落とし所を見つけていきたいです。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてcompanyを使う方は
以下のコマンドを実行します。

M-x package-install company

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name company

実行方法

$ wget http://rubikitch.com/f/141014122338.company.el
$ emacs -Q -f package-initialize -l 141014122338.company.el

20141014123207.png
Fig1: EmacsでIntelliSenseを実現!

バックエンドを定義する

company.elに書かれているサンプルのバックエンド(やや改変)を解説します。

このバックエンドはfooの後に

  • foobar
  • foobaz
  • foobarbaz

を補完します。

(defun company-my-backend (command &optional arg &rest ignored)
  (interactive (list 'interactive))
  (pcase command
    (`interactive (company-begin-backend 'company-my-backend))
    (`prefix (when (looking-back "foo\\>")
              (match-string 0)))
    (`candidates (list "foobar" "foobaz" "foobarbaz"))
    (`meta (format "This value is named %s" arg))))

バックエンドを実行するとき、最初に引数prefixが渡され、
そのバックエンドが有効かどうかを見極めます。

ここではカーソル直前がfooのとき(whenとlooking-back)に有効で、
prefixが渡されたときの返り値fooを返します。

そして、有効なときに引数candidatesが渡され、補完候補を返します。

metaは、それぞれの候補の説明をエコーエリアに表示します。

さらに、このバックエンド自体がコマンドになっていて、
コマンドとして実行した場合は引数interactiveを渡すようにしています。

このコマンドをテンプレートとして使えば
手軽に独自のバックエンドを作れます。

たった1つの関数で閉じている設計が素敵ですね!

本サイト内の関連パッケージ


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。