emacs company.el : Emacs版IntelliSenseの先駆者が息を吹き返している件!Simple is best! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット
パッケージ名 | company |
概要(原文) | Modular text completion framework |
リポジトリ | MELPA |
取得先 | https://github.com/company-mode/company-mode |
バージョン | 20141216.409 |
関連記事 | package:company package:yasnippet package:auto-complete |
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 の略語に使いたいところです。
デフォルトではファイル名も自動補完されるので、 ファイル数が多いディレクトリで固まることもあります。
どうあれ、奥が深いパッケージなので 時間かけて落とし所を見つけていきたいです。
このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。
M-x package-refresh-contents M-x package-install company
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 の略語に使いたいところです。
デフォルトではファイル名も自動補完されるので、 ファイル数が多いディレクトリで固まることもあります。
どうあれ、奥が深いパッケージなので 時間かけて落とし所を見つけていきたいです。
(global-company-mode 1)
$ wget http://rubikitch.com/f/141014122338.company.el $ emacs -Q -f package-initialize -l 141014122338.company.el
http://rubikitch.com/f/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つの関数で閉じている設計が素敵ですね!