Vimも秘伝のタレも飲み込むEmacsの超強力ディストリビューションSpacemacsまとめ

こんにちは。[株式会社ベーシック](https://basicinc.jp/)へ10月に入社した@ryosukesです。
この記事は[プログラミング大好きベーシック Advent Calendar 2015](http://qiita.com/advent-calendar/2015/basicinc)の14日目の記事になります。  

ごった煮感がひどいタイトルですが、Githubから`~/.emacs.d`にcloneするだけでもEmacsをいい感じにしてくれるSpacemacsについてまとめました。

Spacemacsは入れるだけでカラースキームをいい感じにしてくれたり、ファイル検索しやすくしてくれるなど、私のように楽してEmacs強化したい人にはありがたいやつです。こんな感じにすぐできます。

![findfile-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/37036/fb791afe-a57c-f089-a76a-1e6482a710b9.gif)

元はVimからEmacsに移行したい人向けに作られているようですが、Emacsかじりたての初心者〜中級者向きかと。あとたまにEmacs使う人とか。

もちろん好きなパッケージを入れたり設定の変更も簡単にできます。全部見るの面倒って人は、[インストール](#install)するだけでも使えるのでインストールだけでもどうぞ。数分で終わります。

タイトル見て開いたが俺はVimmerだ！Emacsなんて~~クソエディタ~~使ってられるか！
という方は、弊社の@ykyk1218が11日目に投稿した[2015年ももうすぐ終わるし、わいのvim歴史について振り返っておくか（最後にvimプラグインを作ってみた話もあるよ！）](http://qiita.com/ykyk1218/items/ab1c89c4eb6a2f90333a)や、Mac使ってる方は[おまけ](#omake)の1番目だけでもどうぞ。

# 目次

- [Spacemacsとは](#about)
- [インストール](#install)
- [カスタマイズ](#custom)
  - [カスタマイズを始める前に](#before)
  - [カスタマイズしてみよう](#do) 
  - [独自レイヤーの作成](#original)
- [おわりに](#last)
- [おまけ](#omake)
 - EmacsのキーバインドがMacだと他のアプリやブラウザでも一部使える
 - Emacs卒業してAtom
 - Vim上でもEmacsが使えるらしい

では、Spacemacsとはなんぞやというところから軽く始めます。

# <a id="about">Spacemacsとは</a>

![spacemacs_.png](https://qiita-image-store.s3.amazonaws.com/0/37036/9489765e-3c7c-04ea-37b5-68982354d966.png)

[spacemacsで俺のEmacsが強くてニューゲームになった](http://blog.horimisli.me/entry/spacemacs)

最初にも書きましたが、上記リンクの記事を読むと、元はVimを使ってる人がEmacsに移行しやすくなるよう作成されたものだそうです。

しかし、リポジトリには現在このように書かれています。

[syl20bnr/spacemacs](https://github.com/syl20bnr/spacemacs)
*The best editor is neither Emacs nor Vim, it's Emacs and Vim!*

EmacsとVim組み合わせれば最強じゃね？ということですね。
ATOMやSublimetext、各種IDEなどが充実しているこの時代に、issueが500近く、プルリクエストが100近くあるこのリポジトリ。嫌いじゃないです。特に最近は活発に開発されてるみたいでいい感じですね。

Spacemacsを使用するとデフォルトでいろんなパッケージがインストールされるようになっているのですが、[Evil](http://www.emacswiki.org/emacs/Evil)というEmacsでVimをエミュレートするパッケージもデフォルトでインストールされるようになっています。(Evilに関しては今回触れませんが、いろんな人が詳しくブログで取り上げたりしているようなので、ググればたくさん出てくると思います)

他にもデフォルト設定が充実しており、カスタマイズもできるので、秘伝のタレのごとくEmacsをしこしこ育ててきた人でも使えると思います。ここら辺はzshでいうところのoh-my-zshとかに近いノリで出来るかなぁと。

~~あと、似たようなディストリビューションで[emacs-live](https://github.com/overtone/emacs-live)というものもありますが、活発に開発されているSpacemacsをオススメします。~~
`Emacs Live`は`Clojure`の`Quil`や`Overtone`を使ったライブコーディング向けに特化された設定がなされているもので、`Spacemacs`とはそもそものゴールが違うディストリビューションとのこと。

それではさっそく導入していきましょう。

# <a id="install">インストール</a>
[syl20bnr/spacemacs](https://github.com/syl20bnr/spacemacs#prerequisites)
Emacsのバージョンは24.3以上が推奨されています。
満たない場合はREADME.mdに沿ってHomebrewを使ってEmacsをインストールしましょう。

```sh
$ brew tap railwaycat/emacsmacport
$ brew install emacs-mac --with-spacemacs-icon
$ brew linkapps
```

次にspacemacsをインストールします。

1 すでにEmacsの設定があればバックアップをとる

```sh
$ cd ~
$ mv .emacs.d .emacs.bak
```

2 Spacemacsをクローン

```sh
$ git clone --recursive https://github.com/syl20bnr/spacemacs ~/.emacs.d
```

3 Emacsを起動するとパッケージのインストールが始まる。※ 少し時間かかります

.spacemacsという設定ファイルがホームディレクトリにない場合、
インストールの途中で下記初期設定をどうするか対話形式で聞かれるので選択しましょう。

- EmacsかVimかどちらのスタイルを優先するか
- ディストリビューションは標準かミニマルか

```sh
What is your preferred style? {Among the stars aboard the Evil flagship (vim) | On the planet Emacs in the Holy control tower (emacs)}
What distribution of spacemacs would you like to start with? {The standard distribution, recommended. (spacemacs) | A mininalist distribution that you can build on. (spacemacs\
-base)}
```

4 インストールが完了したらEmacsを再起動する


インストールが完了すると`.spacemacs`というファイルがホームディレクトリにできます。
以上でSpacemacsのセットアップ完了です。

スタイルがEmacsであれば`C-x f`でのファイル検索が、素のEmacsと比べて便利になっているのがわかると思います。

themeやpowerlineがすでに入っていたりと、他にも便利な点はあるので、いろいろといじりつつ設定を整えていきましょう。

# <a id="custom">カスタマイズ</a>

## <a id="before">カスタマイズを始める前に</a>
カスタマイズを始める前に、SpacemacsがどのようにEmacsのパッケージを扱うか知っておく必要があります。

通常el-getやcaskでパッケージを管理している場合、`init.el`や`cask`ファイルなどにロードしたいパッケージをまとめて記載しているかと思います。Spacemacsでは、Configuration Layerというある程度パッケージがまとまったレイヤーが`.emacs.d/layers`配下に既にあり、.spacemacsでそれらをロードするかどうか設定し管理することになります。


```sh
$ ls ~/.emacs.d/layers/
+config-files/      +fun/               +tools/             better-defaults/    cscope/             gtags/              org/                search-engine/      spell-checking/
+distribution/      +irc/               +vim/               chinese/            deft/               ibuffer/            osx/                semantic/           spotify/
+email/             +lang/              +window-management/ chrome/             finance/            jabber/             prodigy/            shell/              syntax-checking/
+frameworks/        +source-control/    auto-completion/    colors/             floobits/           nixos/              restclient/         smex/               themes-megapack/
```

`+`がついてるディレクトリは、その下にレイヤーがまとまってます。

```sh
$ ls ~/.emacs.d/layers/+lang/
agda/             clojure/          elixir/           ess/              haskell/          java/             markdown/         purescript/       rust/             sml/              yaml/
asciidoc/         common-lisp/      elm/              extra-langs/      html/             javascript/       nim/              python/           scala/            sql/
autohotkey/       csharp/           emacs-lisp/       fsharp/           idris/            latex/            ocaml/            racket/           scheme/           typescript/
c-c++/            d/                erlang/           go/               ipython-notebook/ lua/              php/              ruby/             shell-scripts/    windows-scripts/
```

各種Configuration Layerをロードしたい場合はそのレイヤーのディレクトリ名を追記するだけでOKです。
例えば、言語毎のmodeを使用したい場合は`+lang`以下にあるレイヤーを追記します。
またこのレイヤーは独自に作成することもできます。

## <a id="do">カスタマイズしてみよう</a>
`.spacemacs`を覗いた方はわかると思うのですが、設定できる項目は結構あるのでピックアップします。
設定したら`M-x dotspacemacs/sync-configuration-layers`を実行することで変更が反映されます。

私の`.spacemacs`の設定も置いておくので、参考にどうぞ。
[.spacemacs](https://github.com/ryosukes/dotfiles/blob/master/.spacemacs)


## `defun dotspacemacs/layers`

### `dotspacemacs-configuration-layers`

ロードするレイヤーを指定します。例えば、デフォルトではコメントアウトされている`git`のコメントアウトをはずすと、`+source-control`配下の`git`レイヤーがロードされます。これで`magit`や`helm-gitignore`などがインストールされ使えるようになります。

レイヤーのディレクトリにREADMEがあるので、詳しく知りたい場合はそのドキュメントを読みましょう。

### `dotspacemacs-additional-packages`

パッケージを個別にインストールします。例えば、`dotspacemacs-additional-packages '(web-mode)`と書けば`web-mode`がインストールされます。ちなみに`web-mode`は`.emacs.d/layers/+lang/html`にあります。

### `dotspacemacs-excluded-packages`

レイヤーの中でロードしたくないパッケージを指定できます。`dotspacemacs-excluded-packages '(evil)`と書けば起動時`evil`はロードされません。

## `defun dotspacemacs/init`

### `dotspacemacs-editing-style`

エディタのスタイルを指定します。`emacs`、`vim`、 `hybrid`を選択でき、`hybrid`にするとEmacsとVim両方のキーバインドがミックスされたようなスタイルになります。詳しくは[ドキュメント](https://github.com/syl20bnr/spacemacs/blob/master/doc/DOCUMENTATION.org#editing-styles)を読みましょう。

### `dotspacemacs-startup-banner`

Emacs起動時のバナーを設定します。`random`にすると開く度にバナーが変わります。
表示されるのは以下の4つです。
一番下はWow.とか言ってるけど何のキャラクターなんだろう…DOGEMACSだから犬なんだろうけど。

![spacemacslogo0.png](https://qiita-image-store.s3.amazonaws.com/0/37036/1e641796-014c-cd0d-0f60-589690d29f1f.png)

![spacemacslogo1.png](https://qiita-image-store.s3.amazonaws.com/0/37036/a4766ed7-d369-c4a3-3b57-d8da8176470f.png)

![spacemacslogo2.png](https://qiita-image-store.s3.amazonaws.com/0/37036/0f04eaca-bc23-3c77-8688-0bbde0f1558c.png)

![spacemacslogo999.png](https://qiita-image-store.s3.amazonaws.com/0/37036/2145b7a4-3622-e11d-2434-c921e84f1140.png)

いらなければnilにすることで出て来なくなります。


### `dotspacemacs-themes`

カラーテーマを変更します。ここに一覧があるので、好みのカラーテーマを設定しましょう。

[Spacemacs Themes](http://themegallery.robdor.com/)

試しに`dotspacemacs-themes '(zonokai-blue)`と記述すると鮮やかな色になります。

![color.png](https://qiita-image-store.s3.amazonaws.com/0/37036/707a3a80-4afe-3c57-744c-9dce843019bd.png)

### `dotspacemacs-default-font`

デフォルトのフォントはadobeのフォント、`Source Code Pro`になっているかと思います。
こればかりは別途インストール作業が必要なのですが、このフォントを使いたい場合[adobe-fonts/source-code-pro](https://github.com/adobe-fonts/source-code-pro)からインストールし設定しましょう。

## `defun dotspacemacs/user-init`, `defun dotspacemacs/user-config`

この関数で、キーバインドの変更など簡単な独自設定を行います。user-initとuser-configの違いは、Spacemacs全体でいつ読み込まれるかです。

user-initは`dotspacemacs/init`のあとに呼ばれます。`dotspacemacs/init`は一番最初に呼ばれるので、user-initは2番目に呼ばれる関数になります。user-configはSpacemacs全体で一番最後に呼ばれます。それぞれの関数の読み込まれる順番を書くと

`dotspacemacs/init` => `dotspacemacs/user-init` => `dotspacemacs/layers` => `dotspacemacs/user-config`

こんな感じになるかと思います。
設定したい内容によっては、順番を意識しないと正常に動いてくれない場合があるので注意が必要です。

## <a id="original">独自レイヤーの作成</a>

`M-x configuration-layer/create-layer` を実行すると、指定したディレクトリに独自レイヤーを作るためのひな形が作成されます。`~/.emacs.d/private/`に`org`という名前のレイヤーを作ろうとした場合以下のようにひな形が作られます。

```sh
$ ls ~/.emacs.d/private/org
extensions.el  packages.el
```

独自レイヤーを作成したい場合は、これらのファイルで独自レイヤーを設定し、
.spacemacsの`dotspacemacs-configuration-layer-path`にディレクトリ名を記述しパスを通してやればOKです。

ただ、個人的な設定は.spacemacsですべて完結しようと思えばできます。
.spacemacsと.emacs.dの二重管理という手間を考えると、独自レイヤーはよっぽど大きくカスタマイズしたい場合を除いて作る必要はなさそうな気がします。


## <a id="last">おわりに</a>

Emacsはエディタ上でブラウザ開くというパッケージが存在していたり、
テトリスもできたり、エディタってなんだっけ感が好きなんですが、
このSpacemacsは「そうそうこういう使えそうなの欲しかったんだよ！」って感じです。作者に感謝。
最近の動向を知りたい方はTwitterアカウントをフォローしましょう。

https://twitter.com/spacemacs

ここまでSpacemacsについてひたすら書いてきましたが、EmacsでもVimでも、AtomでもIDEでも、秀丸でもサクラエディタでも、いいところはそれぞれあります。自分に合ったエディタを見つけて快適なプログラマ生活を送りましょう！

## <a id="omake">おまけ</a>
### おまけ1：EmacsのキーバインドがMacだと他のアプリやブラウザでも一部使える
普段Macを使ってるのですが、ブラウザや他のアプリ上でもEmacsと同じキーバインドがデフォルトでいくつか使えるということに今さら気づいたのでおまけで記載します。

[karabiner](https://pqrs.org/osx/karabiner/index.html.ja) 使えばさらに細かく設定できますが、そこまでやる必要ないって人は`Ctrl+a`、`Ctrl+e`、`Ctrl+k`くらい覚えておけば作業が楽になるかもしれませんね。

| コマンド | カーソルの動き           |
|----------|----------------------|
| Ctrl + a | 行頭へ移動           |
| Ctrl + e | 行末へ移動           |
| Ctrl + f | 右に移動             |
| Ctrl + b | 左に移動             |
| Ctrl + p | 上に移動           |
| Ctrl + n | 下に移動             |
| Ctrl + h | バックスペース       |
| Ctrl + k | 現在箇所から行末まで削除(ヤンク) |
| Ctrl + y | ヤンクしたものをペースト |
| Ctrl + d | 一文字削除           |


### おまけ2：Emacs卒業してAtom

Emacsで有名な書籍といえば、[るびきち](http://rubikitch.com/)氏の[Emacsテクニックバイブル　～作業効率をカイゼンする200の技～](http://www.amazon.co.jp/Emacs%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB%E3%80%80%EF%BD%9E%E4%BD%9C%E6%A5%AD%E5%8A%B9%E7%8E%87%E3%82%92%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%81%99%E3%82%8B200%E3%81%AE%E6%8A%80%EF%BD%9E-%E3%82%8B%E3%81%B3%E3%81%8D%E3%81%A1/dp/4774143278/ref=sr_1_3?ie=UTF8&qid=1449448423&sr=8-3&keywords=emacs)がありますが、[大竹智也](http://d.hatena.ne.jp/tomoya/)氏の[Emacs実践入門　～思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)](http://www.amazon.co.jp/Emacs%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E3%80%80%EF%BD%9E%E6%80%9D%E8%80%83%E3%82%92%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%81%97%E3%80%81%E9%96%8B%E7%99%BA%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%99%E3%82%8B-WEB-DB-PRESS-plus/dp/4774150029/ref=sr_1_1?ie=UTF8&qid=1449448423&sr=8-1&keywords=emacs)も有名ですね。

大竹氏のEmacs実践入門でだいぶ勉強させていただいたのですが、
氏の今年の4/1のブログ記事にびっくりしてしまいました。

[春なのでEmacsを卒業してAtomに入学しました。](http://d.hatena.ne.jp/tomoya/20150401/1427853543)

嘘なのか本当なのかわからん。が、同意です。いいですよねAtom。
私は作業したい内容によってPHPstormとEmacsを分けて使ってるんですが、PHPstorm使う前はAtom使ってました。

### おまけ3：Vim上でもEmacsが使えるらしい

そういえばVimをフォークしてモダンな感じにした[Neovim](https://github.com/neovim/neovim)っていうのもあるようで、そっちは逆にEmacsをVim上で動かせるとか。

[Emacs running in Neovim](https://www.youtube.com/watch?v=xZbMVj9XSUo)

いい時代ですね。

以上、Spacemacsのまとめと今年Emacs使ってて気づいたこと・発見したことでした。