Emacsの設定を共有する

自分がgitで管理している.emacs.dのディレクトリ構造と設定を紹介します. 個別のファイルに分割した設定, 複数のPCで共有したい設定・したくない設定を見通しよく管理でき, pullしてemacsを起動するだけで環境を再現できるので便利です.

設定を構築するにあたって[taraoさんの.emacs.d](https://github.com/tarao/dotfiles/tree/master/.emacs.d)を参考にさせていただきました. というより本質的な部分は丸々借りてきています.

# 必要なツール
- バージョン24以上のEmacs
- git - バージョン管理. 共有したいelispとそうでないものを管理する
- [el-get][el-get] (要`el-get-bundle`を含むバージョン) - パッケージのダウンロードとインストールの自動化する
- [init-loader][init-loader] - elispを複数のファイルに分割して管理する

# ディレクトリ構造
以下に中心となるファイルを示します. 人によっては他に`el-get-user/recipes`やテーマファイルなどもgitで管理すると思います.

```
.emacs.d
├── .gitignore
├── init.el
├── inits
│   ├── .gitignore
│   ├── 00_el-get-install-packages.el
│   ... <gitで管理する他のelisp>
│   └── 99_local-init-load.el
├── local-inits
    ... <サイト固有のelisp>

```

# ファイル
## .gitignore
.emacs.d以下には色々なファイル・ディレクトリが作られますが、必ずgitで管理するのは上で挙げたinit.elとinits/そして.gitignore自身です.

```el:.gitignore
*
# whitelist
!init.el
!inits/
!.gitignore
```

## init.el
init.elでは次の処理を行います.[^2]
1. el-getのインストール・設定
2. init-loaderのインストール・実行

[^2]: 実際はここに書かないと上手く動作しないpower-lineとテーマのロードの記述がありましたが、省略しています. 

このコードでは2.をpackage.elを使って実現しています. stable.melpa.orgのel-getには`el-get-bundle`が含まれていなかったので, `package-pinned-packages`を設定してmelpa.orgからインストールするようにしています. また、package.elを使わない方法が[el-getのREADME.md](https://github.com/dimitri/el-get#basic-setup)に書いてありますので, そちらも確かめてみてください.

```el:init.el
(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

(add-to-list 'load-path (locate-user-emacs-file "el-get/el-get"))

(unless (require 'el-get nil 'noerror)
  (require 'package)
  (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
  (add-to-list 'package-pinned-packages '((el-get . "melpa")))
  (package-refresh-contents)
  (package-initialize)
  (package-install 'el-get)
  (require 'el-get))

(add-to-list 'el-get-recipe-path (locate-user-emacs-file "el-get-user/recipes"))

(el-get-bundle! 'init-loader
  (setq-default init-loader-show-log-after-init nil)
  (init-loader-load))

(el-get 'sync)
```

## inits/
gitで管理するelispを集めたディレクトリです. `init-loader-load`がこれらのelispをロードします. elispのファイル名は数字２文字で始まる必要があり、ファイル名の辞書式順序でロードされます.[^1]

[^1]: これらのディレクトリやファイル名の形式は変更できます


### 00_el-get-install-packages.el
このelでパッケージを自動インストールします. 従ってこのファイルはそれらのパッケージが実際に使われる前にロードしなければなりません. そのため名前を00_xxxとしています. 内容としては`el-get-bundle`の羅列です. 

```el:inits/00_el-get-install-packages.el(例)
(el-get-bundle flycheck)
(el-get-bundle ggtags)
(el-get-bundle multi-term)
(el-get-bundle powerline)
(el-get-bundle use-package)
...
```

### 99_local_init-load.el
ローカルなelispをロードします. この例ではlocal-inits/にelispを格納しています.

```el:local-inits/99_local_init-load.el
(init-loader-load (locate-user-emacs-file "local-inits"))
```

### .gitignore
gitに99_local_init-load.elを無視させます.

```el:inits/.gitignore
*
!*.el
!.gitignore
99_local-init-load.el
```
## local-inits/
gitで管理しないローカルなelispを格納します. こちらもelispを`init-loader-load`でロードするので, 数字２文字で始まるというファイル名の形式を守る必要があります. 無論このディレクトリの名前自体はサイト毎に自由に決められます.

# 運用
最初に書いたようにpushしてpullしてemacsを起動するだけです. 何か問題が発生する場合は, `init-loader-load`のロード順序は適切か, 特にパッケージが適切な順番でロードされているか確認してみてください.

他にuse-package([Qiita記事](http://qiita.com/kai2nenobu/items/5dfae3767514584f5220))などもパッケージの管理を容易にしてくれるのでおすすめです.

[el-get]:https://github.com/dimitri/el-get
[init-loader]:https://github.com/emacs-jp/init-loader