$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

自分流の .emacs管理

 この記事は.emacs Advent Calendar 2013の三日目です。.emacs Advent Calendarということなので、今回は僕自身がどうやって.emacsを管理しているかということについて書こうかなと思います。

 .emacsの管理ってなかなか難しくて、init.elにずっと書き続けていたりするとあっという間に管理不能になったりします。そこで今回は僕自身がどういう構成で、どういう考え方で管理しているかについて、参考程度に紹介したいと思います*1。僕の.emacshttps://github.com/shibayu36/emacs に公開しています。

大雑把な構成

 基本的に以下の様な感じです。

  • 外部elispの管理はpackage.el + el-getを利用
    • MELPAにあるものはpackage.el
    • それ以外はel-getを利用
  • 自分の設定の管理・分割はinit-loaderで
    • 通常のものは.emacs.d/inits/以下に
    • privateな内容を含むものはDropbox

 ディレクトリ的にはこういう感じにしています。

.emacs.d
├── init.el
├── inits
│   ├── 00-init.el
│   ├── 01-display.el
│   ├── 10-dired.el
│   ├── 10-el-get.el
│   ├── 10-package.el
|   |....
│   ├── 80-other-extension.el
│   └── 90-keybinds.el
└── elisp
     ├── elpa
     |   ├── ...
     |
     └── el-get
         ├── ...

 init.elには最低限の設定だけ、inits/以下にファイルで分割しながら自分の設定を書き、elisp以下に外部elispを置く感じです。

外部elispの管理はpackage.el + el-get

 最近はpackage.elとかel-getを利用すれば簡単に外部elispを取ってこれるので、それを利用しています。基本的にMELPAで登録されているelispはpackage.elを使ってインストールできます。ただし、登録されていない場合、package.elではインストール出来ないので、el-getも併用します。

MELPAのものはpackage.elで

 package.elは標準で入っているので、数行の設定をinit.elに書けば、MELPAからインストールしたelisp.emacs.d/elisp/elpa内で管理することができるようになります。

(require 'package)
(setq package-user-dir "~/.emacs.d/elisp/elpa/")
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

 あとはM-x package-install ... とすることでMELPAにあるelispをインストールすることが出来ます。

MELPAになければlocalでrecipe定義してel-getで

 続いてMELPAにないものも手軽にインストールできるように、el-getも同時に使えるようにしてみます。インストールはel-getを使ってみる(インストール編) - $shibayu36->blog; のようにすれば良いです。
 こちらも少しだけ設定を書いておけば、インストールしたものを.emacs.d/elisp/el-get内で管理できるようになります。

(setq el-get-dir "~/.emacs.d/elisp/el-get/")

(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))

(el-get 'sync)

 これでM-x el-get-install ...とすればel-getでelispをインストールすることができるようになりました。あとはel-get-sourcesのの設定をすれば、githubなどにおいてあるelispを自由にインストールすることが出来ます。設定の方法などはこの辺を参考にどうぞ。

ここまで

 以上でとりあえず

  • MELPAに登録されていればpackage-installですぐにインストールできる
  • 登録されていなくても自分でrecipe定義すればel-getでインストールできる

というところまでいけました。この時点で外部elispは簡単に導入できるようになりました。

 その他詳しくは他の記事で書いているので参考にどうぞ。

自分の設定の管理・分割はinit-loader

 僕は自分の設定をinit-loaderというのを利用して、適切なサイズにファイル分割しながら管理しています。init-loaderというのは特定のディレクトリを指定しておくと、その中にあるファイルをファイル名順で順々にloadしていってくれるやつです。エラー管理とかもファイル単位でしてくれます。

init-loaderの導入

package.elとinit-loader.elの同時利用での問題にハマった - $shibayu36->blog; この辺にかいてありますが、先ほど紹介したpackage.elを使ってインストールできるので簡単です。

M-x package-install init-loader

init.elでloadするディレクトリを指定

 あとはloadするディレクトリを指定しておくだけで、特定のディレクトリにファイルを置けば勝手に読み込んでくれるようになります。

 僕の場合は通常はgithubで公開しつつ、ちょっとprivate情報も含むような設定はDropboxに入れているので、init-loaderで二つディレクトリを指定しています。init.elにこんなかんじで設定しておくと順に読み込んでくれます。

;;設定ファイルはinits以下に置いていて、init-loaderによって読み込まれる
(require 'init-loader)
(init-loader-load "~/.emacs.d/inits")
(init-loader-load "~/Dropbox/config-file/.emacs.d/inits")

 これでとりあえず.emacs.d/inits/ 以下にいろいろファイルを置くだけで勝手にemacsが読み込んでくれるようになりました。

適切に分割して設定を置く

 ここまでで.emacs.d/inits/以下にファイルを置くだけで勝手にemacsがloadしてくれるようになったので、後は自分の好みの単位でファイルに分割して設定していきます。

 この分割の仕方は人それぞれだと思いますが、僕は以下の方針で分割しています。

 こういう風に分割している理由はある設定をどこに設定しているか分かりやすくするためです。完全に好みの問題という感じですが。あとは一年に一回くらいファイル一覧を眺めて、要らなかったものを消したりとかしてます。前回こんな感じで大掃除とかしてました。

ここまで

 ここまでで

  • .emacs.d/inits/ にファイルを置くだけで設定を勝手にloadしてくれるように
  • privateな情報が入っているものは分けられるように
  • あとは好みで分割して設定追加していく

という感じになりました。

 こちらも参考URLを貼っておきます。

まとめ

 さて今回は僕の.emacsの管理のやり方を書いてみました。一応このくらい設定しておくだけで、何か拡張を試したければ、

  • package-installでインストール
  • inits/以下にそれ用の設定を置く

という二手順で簡単に試せるようになりました。やっぱり要らないと思った時もinits/以下に置いたファイルを消して、package-list-packagesの一覧などからインストールしたファイルを削除するだけで戻すことも出来ます。いろいろお手軽にelispを試せますね。

 ただ現状でもまだ少しずつ不満があるので、今後も改善していきたいです。改善したいところとしては以下の様なところです。

  • MELPAに登録していないものをインストールするためだけにel-getを利用している
    • package.elでlocalにrecipeを登録できればよいだけではないか
  • elispのバージョン固定が出来ない
    • 一気にelispが最新化されてたまに壊れる


 この記事は.emacs Advent Calendar 2013の三日目でした。明日の担当はmori-devさんです。お楽しみに。

*1:そこまで真新しいものはないかもしれませんが