Elixir の Emacs でのコード補完を auto-complete で


# alchemist のコード補完

Emacs で Elixir 書くには elixir-mode に加えて [alchemist](https://github.com/tonini/alchemist.el) を使うのが定番。

alchemist は "Elixir Tooling Integration Into Emacs" ということで、Emacs の中から Mix や IEx を使えるようにしたり、ドキュメントを引けるようにしたりいろんなインテグレーションをしてくれる。

- Mix integration
- Compile & Execution of Elixir code
- Inline code evaluation
- Documentation lookup
- Definition lookup
- Powerful IEx integration
- **Smart code completion**
- Elixir project management
- Integration with company-mode

で、その幾つかの機能のひとつにコード補完がある。個人的にはこれが最も重要な機能である。

この alchemist のコード補完は [company-mode](http://company-mode.github.io/) で実現されている。

# company-mode ではなく auto-complete で補完したい

company-mode は Emacs のコード補完拡張として有名だけれども、同じくコード補完と言えば [auto-complete](https://github.com/auto-complete/auto-complete) がある。日本では、開発者やメンテナが日本人であることもあってか後者を使ってる人の方が多い印象。例によって自分も auto-complete 派である。

で、auto-complete に慣れていると company-mode だと微妙にいつもと調子が違って馴染まない。困ったな、と思っていたら syohex さんが alchemist のコード補完を auto-complete に変更してくれる拡張を作ってくれた。

## ac-alchemist

[ac-alchemist](https://github.com/syohex/emacs-ac-alchemist) がそれである。

[まだできたてほやほや](https://twitter.com/syohex/status/629461613398003712)なので MELPA などには上がっておらず、GitHub のみでの公開となっているようだ。

導入は簡単で、alchemist と ac-alchemist　を入れて

```
(add-hook 'elixir-mode-hook 'ac-alchemist-setup)
```

とするだけだった。

![8ff19a4312efbe733039be7a08f8aa8211e9188a.png](https://qiita-image-store.s3.amazonaws.com/0/1834/be2de64b-6bd3-7ded-b213-a5c7feef9050.png "8ff19a4312efbe733039be7a08f8aa8211e9188a.png")


結果、いつもの感じで auto-complete でコード補完された。

# 蛇足1: Cask

ちなみに自分は拡張ファイルのパッケージ管理に [Cask を使ってる](http://d.hatena.ne.jp/naoya/20140424/1398318293) ので Cask ファイルに

```
(depends-on "elixir-mode")
(depends-on "alchemist")
(depends-on "ac-alchemist" :git "git@github.com:syohex/emacs-ac-alchemist.git")
```

と書いて、GitHub から直接インストールしている。

最初 ac-alchemist を入れたときはエラーになってしまったが、`cask update` で alchemist も最新にしたら動くようになった。GitHub のドキュメントに

> alchemist.el frequently changes its interfaces. Please report me if ac-alchemist does not work. I test only with latest alchemist.el. Please upgrade alchemist.el and test before reporting me.

とあるとおり、alchemist はインタフェースがちょいちょい変わるので、古いやつを使ってて互換性がなかったためだと思われる。

なお、拡張の管理は [昨今は Cask より El-Get がおすすめらしい](http://d.hatena.ne.jp/tarao/20150221/1424518030) が、めんどくさいので移行はしてない。ただ、`cask update` すると入れてるもの全部一気にバージョンが上がってドキドキするので、これで何かトラブったら El-Get に移行するかもしれない。

# 蛇足2: compapny と auto-complete

company と auto-complete には使い勝手に微妙な差があり、自分は auto-complete に体が完全に馴染んでるので company-mode はうけつけない感じなのだが、客観的にみてどっちが良いのかは正直わからない。

わからないが、以前に開発者の m2ym さんが以下のURLで company と auto-complete の違いについて書いていて

- http://dev.ariel-networks.com/wp/documents/aritcles/emacs/part10

> auto-completeに似た機能を持つものとしてcompany-mode(*5)という拡張があります。この拡張は機能の充実性および安定性でauto-completeより優れていると思います。ライセンスも同じで機能も同じソフトウェアが存在する意味はないので、どちらか一方が消滅すべきだと最近まで考えていましたが、よくよく考えてみるとそこには微妙なコンセプトの違いがあることを発見しました。
(中略)
> company-modeは良くも悪くもEmacs的です。Emacsになじみの深い人にはcompany-modeはしっくりくるものでしょう。一方、auto-completeにはEmacsの悪しき面を改めるという私の精神が反映されているため、かなり前衛的なことにも取り組んでいます。
(中略)
> 3. 空気のように使えるインターフェースの実現
(中略)
> (3)はかなり抽象的ですが、要するに特に意識せずに自然に補完が行えるようなインターフェースを実現するということです。脳へのオーバーヘッドをなくすことはコーディングの本質に没頭でき作業効率のさらなる向上が期待できます。

特にこの「空気のように使えるインタフェース」というところにこだわりがあるのは良いなと思っていて、それでずっとこれを使っている。補完されることを意識しなくてもキータイプに合わせて滑らかに補完されていく auto-complete の性質は、この辺のコンセプトから来ているのかなと想像している。