init-loader.el と package.el を導入して快適 Emacs ライフ

今まで（恥ずかしながら）適当だった Emacs の設定を改革したらとても快適だったので紹介します

今回紹介したいのは

* `init-loader.el`
* `package.el`

です


# init-loader.el

今まで `.emacs` に適当に設定を書いていたので以下の様な問題で悩んでいました

* 環境依存（具体的には Mac と Ubuntu）な設定を分離出来ないので環境構築に手作業が発生する
* 設定を追加しても上の事情で各々の環境に手作業で導入する必要がある

ということで `init-loader.el` の出番です

https://github.com/emacs-jp/init-loader

`~/.emacs.d/site-lisp/` 以下に  `init-loader.el` を置いて `~/.emacs.d/init.el` に

```cl:init.el
;; ~/.emacs.d/site-lisp 以下全部読み込み
(let ((default-directory (expand-file-name "~/.emacs.d/site-lisp")))
  (add-to-list 'load-path default-directory)
  (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
      (normal-top-level-add-subdirs-to-load-path)))

(require 'init-loader)
(setq init-loader-show-log-after-init nil)
(init-loader-load "~/.emacs.d/inits")
```

と書きます

最初に `~/.emacs.d/site-lisp` 以下のものを全部読み込んでしまいます

するとそれ以下に置いた `init-loader.el` が読み込まれますので単純に require するだけで実行できます

これで `~/.emacs.d/inits` ディレクトリ以下に置かれた設定ファイルを読み込ませることができます

ちなみにデフォルトもこの値なので上の設定は冗長ですが，今回は明示的に書いてあります

 `~/.emacs.d/inits` ディレクトリ以下のファイルは以下の設定に従って作成します

* 環境に依存しない設定はファイル名の最初に 2 桁の数字をつける
    * 番号は優先度で 00 が最初に読み込まれて， 99 が最後に読み込まれる
    * 同じ数字を付けても良い
* 環境依存な設定はそれぞれの環境のプレフィックスをファイル名の最初につける

プレフィックスは以下のようになります

|       環境       |       prefix      |
|:----------------|------------------:|
| Meadow          |            meadow |
| Carbon Emacs    |      carbon-emacs |
| Cocoa Emacs     |       cocoa-emacs |
| emacs -nw       |                nw |
| Windows         |           windows |
| Linux           |             linux |

なので `00-keybind.el` とか `cocoa-emacs-appearance.el` のように `prefix` - `機能名` `.el` とファイル名をつけます

ファイルを機能ごとに分割するとメンテナンス性が格段に向上するので機能ごとにファイルを分割して作成してください

番号に特に決まりはないと思いますが，次に紹介する `package.el` 周りの設定は 20 番台に書くことが多いようです


# package.el

Emacs でも `apt-get` とか `gem` とか `cpanm` 的なあれを使いたくなります

Emacs24 から標準で入った `package.el` を使えば簡単に使えるようになるので使います

ただデフォルトのままでは入れられる種類が少ないので少し設定を追加します

`~/.emacs.d/inits` 以下に `20-package.el` を置いて

```cl:20-package.el
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)
```

と書きます

これで `M-x package-list-packages` とやるとインストールできるパッケージのリストが見れて，この上からインストールができます

* インストールしたいパッケージの上で `i` キーを押す
* 選択し終わったら `x` を押す

これでインストールができます

リストの取得でインターネットに接続しないでキャッシュから見たい時は `M-x package-list-packages-no-fetch` とします

また入れるパッケージの名前がわかっているなら `M-x package-install` としてもインストールできます


## 自動インストール設定

最初に必ずインストールするものがあるなら自動設定しておきたいので設定します

先ほどの設定の後に（私は `20-package.el` の中に書いてしまっています）

```cl:
(require 'cl)

(defvar installing-package-list
  '(
    ;; ここに使っているパッケージを書く。
    php-mode
    scala-mode
    markdown-mode
    scss-mode
    haskell-mode
    google-c-style
    yaml-mode
    open-junk-file
    ))

(let ((not-installed (loop for x in installing-package-list
                            when (not (package-installed-p x))
                            collect x)))
  (when not-installed
    (package-refresh-contents)
    (dolist (pkg not-installed)
        (package-install pkg))))
```

こんな感じのことを書いておきます

こうするとインストールされていなければ自動でインストールされるようになります

# サンプルファイル

以上の設定をしたものを [catatsuy/dot.emacs.d · GitHub](https://github.com/catatsuy/dot.emacs.d) に置きました

参考程度に御覧ください