君は誰とEmacsる？ (補完インターフェイス紹介篇)

Anything? それともIDO?

## 承前

Emacsの初期設定の補完インターフェイスは前方一致補完しかできないので、効率を上げるための代替手法を提案する。

具体的には<kbd>C-x C-f</kbd>(`find-file`)とか<kbd>C-x b</kbd>(`switch-to-buffer`)、<kbd>M-x</kbd>(`execute-extended-command`)みたいなコマンドの操作性を改善できる。

![find-file-default.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/ca74c53a-03ca-72fc-c228-34fc43e7a480.gif)

### 注意

拡張パッケージをインストールする際には[package.el - Emacs JP](http://emacs-jp.github.io/packages/package-management/package-el.html)と[Getting Started - MELPA](https://melpa.org/#/getting-started)を参考にMELPAの設定をすること。

また、以下に紹介する「**IDO**」「**Helm**」「**Counsel**」「**Anything**」のどれかを選んで、**設定は混在させない**方が良い。

## 最初に比較表

| パッケージ名   | リポジトリ    | 独断と偏見による立ち位置   |
|----------------+---------------+----------------------------|
| IDO (ido-mode) | Emacs標準添付 | 最近は利用者多い印象・さくさく     |
| Ivy/Counsel    | MELPA<br>[GNU ELPA] | 新進気鋭・さくさく         |
| Helm           | MELPA         | 定番だけど拡張仕様が安定しない |
| Anything       | MELPA         | 良くも悪くも枯れてる       |

この場合の[枯れた](http://www.nttpc.co.jp/yougo/%E6%9E%AF%E3%82%8C%E3%81%9F.html)は比較的ポジティブな意味です。筆者はHelmが慣れてるのでこれを使ってますが、Anythingを使ってるひともまだまだたくさん居ますし、これから導入するなら**Ivy/Counsel**も良い選択肢です。

[GNU ELPA]: https://elpa.gnu.org/packages/

## IDO (`ido-mode`)

[IDO](https://www.gnu.org/software/emacs/manual/html_node/ido/index.html)(**Interactive Do**または**Interactively Do Things**)は最少のキーボード打鍵で補完入力できるように設計された補完入力インターフェイスです。Emacsに同梱されてるので、最少の設定で利用する場合はパッケージ導入が不要です。

**バッファ切替**と**ファイル名補完**が主機能ですが、`ido-everywhere`を有効化すると、それ以外の箇所でもIDOインターフェイスが利用できます。

![find-file-ido.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/2ad288d7-1663-763a-57d9-61e54eae31a0.gif)

### idoの設定

.emacsファイル(`~/.emacs.d/init.el`)に以下のように記述します。デフォルトでは前方一致で利用するので、`(setq ido-enable-flex-matching t)`で曖昧一致で絞り込みができるようになって便利です。

```init.el
(ido-mode 1)
(ido-everywhere 1)

(setq ido-enable-flex-matching t) ;; 中間/あいまい一致
```

### idoを強化する

#### smex

[smex](https://github.com/nonsequitur/smex)はIDOのインターフェイスを利用して<kbd>M-x</kbd>を再定義してくれるパッケージです。`M-x package-install smex`でインストールできます。

```init.el
(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "M-X") 'smex-major-mode-commands)
```

#### ido-ubiquitous

[ido-ubiquitous](https://github.com/DarwinAwardWinner/ido-ubiquitous)は標準設定以上のあらゆる箇所でidoが有効化されるように強化するパッケージです。`M-x package-install ido-uniquitous`でインストールできます。

```init.el
(ido-ubiquitous-mode 1)
```

#### ido-vertical-mode

![](https://qiita-image-store.s3.amazonaws.com/0/4121/35b4451e-cabc-89db-49b6-4c275549ca48.png)

[ido-vertical-mode](https://github.com/creichert/ido-vertical-mode.el)はIDOの候補を縦に並べるためのパッケージです。デフォルトのIDOが要素を横に並べるのが見にくければ、これで縦に並べることができます。

```init.el
(ido-vertical-mode 1)
```

## Ivy/Counsel

[Ivy](https://github.com/abo-abo/swiper)は補完/絞り込み用のインターフェイスで、CounselはそれをベースにしたEmacsコマンドのラッパーです。キーボード入力で絞り込みできるのみならず、カーソル移動(<kbd>↑</kbd> <kbd>↓</kbd>または<kbd>C-n</kbd> <kbd>C-p</kbd>)で要素を選択することもできます。

Ivy/Counselの大本のSwiperはバッファ内を絞り込み検索するための機能です。([swiper.el : 一覧付き正規表現isearch！C-u C-sを置き換えろ](http://emacs.rubikitch.com/swiper/)など参照)

![find-file-counsel.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/0b228e18-4576-4661-f97f-d51e58dd86d3.gif)

### 設定

`M-x package-install counsel`でインストールできます。(依存関係でSwiperとIvyもインストールされます)

```init.el
(ivy-mode 1) ;; デフォルトの入力補完がivyになる
(counsel-mode 1)
;; M-x, C-x C-fなどのEmacsの基本的な組み込みコマンドをivy版にリマップする

;;; 下記は任意で有効化
(global-set-key "\C-s" 'swiper)
(global-set-key (kbd "C-c C-r") 'ivy-resume)
(global-set-key (kbd "<f6>") 'ivy-resume)
(global-set-key (kbd "<f2> u") 'counsel-unicode-char)
(global-set-key (kbd "C-c g") 'counsel-git)
(global-set-key (kbd "C-c j") 'counsel-git-grep)
(global-set-key (kbd "C-c k") 'counsel-ag)
(global-set-key (kbd "C-x l") 'counsel-locate)
(global-set-key (kbd "C-S-o") 'counsel-rhythmbox)

;; これらは counsel-mode で自動で設定されるため、明示的に設定しなくてよい
;;(global-set-key (kbd "M-x") 'counsel-M-x)
;;(global-set-key (kbd "C-x C-f") 'counsel-find-file)
;;(global-set-key (kbd "<f1> f") 'counsel-describe-function)
;;(global-set-key (kbd "<f1> v") 'counsel-describe-variable)
;;(global-set-key (kbd "<f1> l") 'counsel-load-library)
;;(global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
;;(define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
```

## Helm

[Helm](https://emacs-helm.github.io/helm/)はさまざまな情報源から絞り込むインターフェイスを提供するフレームワークです。Ivy/Counselと同じく、カーソル移動(<kbd>↑</kbd> <kbd>↓</kbd>または<kbd>C-n</kbd> <kbd>C-p</kbd>)で要素を選択することもできます。

また、Helmによるファイル選択には、単にファイルを選ぶだけではない「アクション」と呼ばれる概念があります。詳細な紹介はAnythingメンテナー@rubikitchさんの[#11 Emacs に革命を起こすパッケージ「helm」 (Software Design 2015年3月号掲載記事)](http://emacs.rubikitch.com/sd1503-helm/)をお読みください。

![find-file-helm.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/ea0e9d53-c3ef-7bf2-d0d4-46fd65f69947.gif)

### 設定

`M-x package-install helm`でインストールできます。

```el
(require 'helm-config)
(helm-mode t)
(global-set-key (kbd "M-x") 'helm-M-x)
```

## Anything

[Anything](https://www.emacswiki.org/emacs/anything)はさまざまな情報源から絞り込むインターフェイスを提供するフレームワークです。Ivy/Counselと同じく、カーソル移動(<kbd>↑</kbd> <kbd>↓</kbd>または<kbd>C-n</kbd> <kbd>C-p</kbd>)で要素を選択することもできます。

HelmはAnythingから派生したプロジェクトですが、オリジナルのAnythingは別プロジェクトとして維持されてます。

![find-file-anything.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/9905889d-d01a-a212-7e75-7706ef0ca22a.gif)

### 設定

`M-x package-install anything`でインストールできます。

設定については[もう初心者なんて言わせない、Anything で始まる Emacs 道。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20090423/1240456834)や[Anything の設定ことはじめ。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20090424/1240571958)などを参照してください。

## あとがき

### なぜ補完インターフェイスが必要なのか?

筆者は比較的最近までEmacsがとても苦手でした。設定したコマンドのキーバインドや<kbd>M-x</kbd>に前方一致で入力はコマンド名を丸暗記しないと使ひものにならないと思ってたので、英語が苦手なのも相俟ってかなりつらいものでした。

ところで、Sublime TextやAtom、Visual Studio Codeなどの最近のエディタには「コマンドパレット」と呼ばれる機能があります。これはキーボードショートカットを覚えなくても機能を検索して呼び出せるスグレモノです。

![Atom command pallet](https://qiita-image-store.s3.amazonaws.com/0/4121/6174bb58-a4fb-fe3c-31d9-0134fed1970c.png)
![Visual Studio Code command pallet](https://qiita-image-store.s3.amazonaws.com/0/4121/53a9a348-f401-69bf-6be3-1dd56f935584.png)

さて、デフォルトの<kbd>M-x</kbd>を補完インターフェイスで拡張した`helm-M-x`、`counsel-M-x`のようなコマンドを利用すればコマンド名を丸暗記して前方一致検索しなくても、うろおぼえで適当に入力すればコマンドが起動できるようになってべんりです。また、語順を気にしなくても良いので私のようにものおぼえが悪くてもあんしんです。

![Emacs helm-smex](https://qiita-image-store.s3.amazonaws.com/0/4121/d27f0104-b507-a3d5-c348-9886dd2137c6.png)

### 別の選択肢 (Spacemacs)

Emacsのオススメ設定みたいなのをまとめたパッケージはいろいろあるんですが、最近は[Spacemacs](https://github.com/syl20bnr/spacemacs)ってパッケージが好評を博してるようで「デフォルトがVimキーバインド」(Emacsキーバインドに設定可能)と書くとギャグにしか見えないのですが、GitHubでStarが9000個以上ついて居り世界中に多数の利用者、これからEmacsに触れるひとはこちらもを使ってみるのも良いのでは。

詳しくは[Vimも秘伝のタレも飲み込むEmacsの超強力ディストリビューションSpacemacsまとめ](http://qiita.com/ryosukes/items/d0ec5094a9d3d636f7bb)とか[spacemacsについて 〜spacemacsが最強で最高で神エディタであると思い始めた件〜](http://qiita.com/nobkz/items/994c6b3e6f42a0e33fef)あたりを参照のこと。

### 結局どれがオススメなの?

これから入れるならIvy/Counselが癖が少なくておすすめ、外部パッケージとか入れるのが面倒ならIDOも良いんじゃないかな、みたいな意見です。筆者はHelmと[helm-smex](https://github.com/ptrv/helm-smex)を使ってます([ivy-smex](https://github.com/purcell/ivy-smex/blob/master/ivy-smex.el)もあるようです)。AnythingはHelmに派生しましたが、Anythingに慣れてるなら別の補完インターフェイスに以降するメリットもさして多くはないです。