auto-completeユーザのための company-modeの設定

# company-mode

みなさんは Emacsの入力補完に何を使っているでしょうか ?

日本人の方は作者が日本人(@m2ymさん)ということもあり, [auto-complete](https://github.com/auto-complete/auto-complete/)を使っている方がわりと多いと思うのですが, 海外では圧倒的に [company-mode](https://github.com/company-mode/company-mode/)が利用されています.(stackoverflowで auto-completeに関する質問があると, とにかく company-modeを使えとだけ書かれてしまうことも...). 一昔前だと補完系の開発者の方は auto-complete版と company-mode版を作成したということもありますが, 最近だと company-mode限定という場合も多く見られます(Rust, Elixirなど. 新しく出た言語は特にその傾向が強い). このため auto-completeユーザは何かと厳しいことがあります. 私は auto-completeの co-maintainerをしており, そういう状況があまり良くないと思っています. そこで company-modeしか対応していなかった, Elixir補完のための [ac-alchemist](https://github.com/syohex/emacs-ac-alchemist), 絵文字補完のために [ac-emoji](https://github.com/syohex/emacs-ac-emoji), Rust補完のための [ac-racer](https://github.com/syohex/emacs-ac-racer)などを作りました. しかし一人でまともに書いたこともない言語のツールを作っても, 動くようにしておくというのが精一杯で新しい機能を追加などのことが行えておらず, やっぱり厳しいです

新規ユーザの方であれば, そのような場合でもなんの問題もなく, company-modeを使えると思うのですが, auto-completeを使用している方は設定がわからないとか移行が面倒といったことがあるかと思います. そこでここでは company-modeのインストールから auto-completeっぽく使うための最小限の設定を示していきます.


## インストール

company-modeのパッケージ名は `company-mode`でなく `company`です. Caskをご利用の方は注意しましょう.

#### package.el

[MELPA](https://melpa.org/) or [MELPA Stable](https://stable.melpa.org/)を `package-archives`に追加し, `M-x package install <RET> company <RET>`

#### Cask

Caskファイルに以下を追加

```lisp
(source melpa) ;; or (source melpa-stable)
(depends-on "company")
```

#### el-get

```lisp
(el-get-bundle company-mode/company-mode)
```

## 基本設定

```lisp
(global-company-mode +1)

;; 自動補完を offにしたい場合は, company-idle-delayを nilに設定する
;; auto-completeでいうところの ac-auto-start にあたる.
(custom-set-variables
 '(company-idle-delay nil))
```

## 色周りの設定

auto-completeユーザが company-modeに対して持つ第一印象は色が変だということだと思います(デフォルトは以下のような感じ). auto-completeを見たことなければそう思わないかもしれないですが, auto-completeを使った人からするとずいぶん違って見えてしまうように思えます.

![company-semantic.png](https://qiita-image-store.s3.amazonaws.com/0/12235/a2a7f597-be54-9874-31ee-60baeae69349.png)

これを auto-completeっぽく変更するには以下のようにします.

```lisp
(set-face-attribute 'company-tooltip nil
                    :foreground "black" :background "lightgrey")
(set-face-attribute 'company-tooltip-common nil
                    :foreground "black" :background "lightgrey")
(set-face-attribute 'company-tooltip-common-selection nil
                    :foreground "white" :background "steelblue")
(set-face-attribute 'company-tooltip-selection nil
                    :foreground "black" :background "steelblue")
(set-face-attribute 'company-preview-common nil
                    :background nil :foreground "lightgrey" :underline t)
(set-face-attribute 'company-scrollbar-fg nil
                    :background "orange")
(set-face-attribute 'company-scrollbar-bg nil
                    :background "gray40")
```

これで以下のような感じになります(スクロールバーは個人的に見やすい色にしていますが, 好きなようにカスタマイズしてください) 

![auto-complete-face.png](https://qiita-image-store.s3.amazonaws.com/0/12235/90bf87fe-5125-c08a-c2e4-9294337b21b6.png)


## キーバインドの設定

以下で基本的に同じような感じにできるかと思います.

```lisp
(global-set-key (kbd "C-M-i") 'company-complete)

;; C-n, C-pで補完候補を次/前の候補を選択
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-search-map (kbd "C-n") 'company-select-next)
(define-key company-search-map (kbd "C-p") 'company-select-previous)

;; C-sで絞り込む
(define-key company-active-map (kbd "C-s") 'company-filter-candidates)

;; TABで候補を設定
(define-key company-active-map (kbd "C-i") 'company-complete-selection)

;; 各種メジャーモードでも C-M-iで company-modeの補完を使う
(define-key emacs-lisp-mode-map (kbd "C-M-i") 'company-complete)
```

## quick-help

company-modeには auto-completeでいうところの quick-help機能がデフォルトではありません. documentは minibufferに表示されます. quick-help機能を company-modeで使う場合は [company-quickhelp](https://github.com/expez/company-quickhelp)をインストールし, company-quickhelp-modeを有効にします.

(注意: pos-tipを使っているので no-window版では利用することはできません)

```lisp
(company-quickhelp-mode +1)
```

![company-quickhelp](https://github.com/expez/company-quickhelp/raw/master/company-quickhelp.png)


## おわりに

company-modeを auto-completeぽく設定する方法を紹介しました. auto-completeと company-modeどちらが合うとかは人によりけりだと思うのですが, 変にどちらかを使わないといけないと固執する必要はないと思います. 機能的に干渉するというわけでもないですし. どちらか一方にしか対応していない場合というのは, 素直にもう片方を使ってみた方がいいと私は思います. 変に対応を待つことでそのときの情熱が失われたり, 開発効率が落ちるというのはアホらしい話なのでね.


上記のこと以外でわからないことがあるという方はここのコメントか[私](https://twitter.com/syohex)に tweetしていただければとよいかと思います(私は上述の通り auto-completeの co-maintainerであるので, Dog-foodingするために基本 auto-completeを使っていますが, 学習のために company-modeを設定しているマシンもあります). もちろん auto-completeに関することでも構いませんのでわからないことなどがありましたら, ご連絡いただければと思います.


明日は @akisute3@github さんです.