el-get を使って Emacs でパッケージ管理

みなさんが毎日使ってらっしゃる Emacs にも、残念ながら弱点があります。インストールした elisp の管理です。そこで今回は本問題を解決してくれそうな希望の星、el-get についてです。

el-get について

el-get とは、github dimitri/el-get で開発が進められている、Emacs で機能の拡張に使う elisp らを、apt-get などのパッケージ管理システムのように管理してくれるものです。
http, cvs, svn, git, hg, bzr, apt-get, elpa, github 等、多彩な取得コマンドと、柔軟な設定方法により、elisp の管理を段違いに簡単にしてくれます。
1年前ほどからブログ等で紹介され始めているのですが、現在はかなり el-get が進化した結果、情報が正しくなくなってしまっているため、最近の el-get について書いていきます。

他の elisp インストーラとはどう違うのか

ある程度 Emacs を使われた方は分かると思いますが、elisp の管理はとんでもなく面倒です。デファクトスタンダードなルールもなく、正直カオスな状態です。
一番原始的な方法だと、逐一ダウンロード、load-path の通っている所へ移動、バイトコンパイル、となるわけですが、毎回こんなことはやっていられません。
そこで便利なのが auto-install です。Emacs 関係の本でおなじみのるびきちさんによる elisp です。

  • URL を入力すれば決まった位置にダウンロード、コンパイルまでしてくれる優れもの。
  • 他にも emacswiki 上の elisp を指定して自動で処理、batch-install で複数ファイルで構成されている拡張も自動で処理してくれます。
  • しかしこの方法でも、emacswiki にないものは自力でURLを探索しなければなりませんし、
  • アップデートにコマンド一つというわけにはいかず、手軽さに優れるものの、管理まではできません。


次に、次期 Emacsバージョンである Emacs 24 からデフォルトで搭載される予定の、package.el を使う方法です。

  • これはあらかじめレポジトリを登録しておき、そこから elisp を選んでダウンロード、コンパイル、load-path を通す、というところまで全自動です。

これで完全な気もしますが、そうでもありません。

  • まず、アップデート用のコマンドがありません。別バージョンをインストールすることになります。だいたいの方は上書きでアップデートすることを望んでいるものだと思います。
  • また、アンインストール用のコマンドも用意されていません。
  • デフォルトでは設定されていませんが、既にレポジトリはいくつかあり、ユーザーが自由に登録できるものもあります。(MarmaladeMELPA)
    ただその際、elisp の側から一定の方法に則って登録してあげる必要がありますので、パッケージの登録が面倒です。適当に追加してすぐ使いたい、という訳にはいきません。
  • 追加が面倒なので無いものは auto-install 等でインストールすることになってしまうため、結局 package.el で管理することはできなくなります。
  • さらにいえば、膨大な過去資産が含まれる emacswiki を直接利用できません。


そして以上の欠点を解決しているのが、el-get です。

  • el-get はあらかじめ用意された rcp ファイル (recipe と呼ばれる) および独自の変数にある定義を用いてリストを作り、そこからインストール、アップデート、削除、recipe の参照やウェブサイトの参照も出来ます。
  • el-get にはアップデート用のコマンドがあり、一つずつでも、全体でもコマンド一つでアップデートすることが出来ます。
  • el-get には emacswiki にある elisp を自動で rcp ファイルにしてリストに追加するコマンドを持っており、emacswiki 上にしかない elisp も管理することが出来ます。
  • el-get は emacswiki の資源の利用のみならず、package.el の資産である ELPA、その他のレポジトリも直接利用することが出来ます。
  • さらに rcp や emacswikiELPA にもない elisp を管理したいときは、el-get-sources という変数にリストを追加してやれば、即座にリストに追加できます。任意の rcp ファイルを作成する、という方法でも即時追加できます。
    書式も簡単で、短ければ 3 行ほどです。
    haml-mode の rcp
  • package.el では autoload に対応させるには登録する側の対応が必要でしたが、el-get は自動生成します。大体の場合、必要な関数を呼べば autoload されるため、require を書く必要が激減します。
  • 冒頭に書いたように、取得方法も多様で、多様な公開形態に対応できます。アーカイブのままダウンロードしてきて解凍、配置、なんてこともできます。

このように、el-get は今現在、様々な欠点を克服した、現段階でもっとも良い elisp の管理方法ではないかと思います。
欠点としては、rcp にたまに問題があることですが、定義は簡単ですので、見つけ次第皆で直していけばすぐ問題なくなるかと思っています。私も何度か dimitri/el-get に push しています。

el-get の使い方

インストールには以下の elisp を scratch バッファ等で実行します。

デフォルトでは ~/.emacs.d/el-get/ にインストールします。変更したい人は el-get-dir を適当に設定しましょう。

さて、肝心の使い方ですが、基本的には
M-x el-get-list-packages
で表示されるリスト中で、インストールしたいもののうえで i を押下してインストールするためのマークをつけ、x で実行です。これらのコマンドはリスト上で h を押下すればミニバッファにヘルプが表示されます。? を押して詳細を確認できるのがすばらしいです。recipe の定義中に当該 elisp のウェブサイトが記載されていることも多く、description だけでなく、もう少し知りたいと思ったときにも行動がとてもスムーズに行えます。
アップデートやアンインストールも同様にリスト上から行えますので、覚えることはとても少ないです。

これらはコマンドですべてコマンドで行うことも出来ます。
なお、el-get 自身のアップデートには
M-x el-get-self-update
が、インストールしているもの全てのアップデートには
M-x el-get-update-all
というショートカットが用意されています。

定義済みの recipe だけで事足りるなら以上ですむのですが、多岐にわたる elisp 資産らを網羅できているわけではないので、やはり足りない部分は自分で定義していくことがあると思います。
recipe はインストールされたディレクトリに保存されているものの他、emacswiki に存在する elisp の recipe を自動で生成することが出来ます。そのためのコマンドが
M-x el-get-emacswiki-refresh
です。実行する度に作り直してくれます。
現在ローカルに取得済みの情報から package.el を通してインストールできるもののレシピを自動生成するのは
M-x el-get-elpa-build-local-recipes
です。

emacswiki にもないものの定義を追加するには、el-get-sources という変数にリストで追加していきます。こんな感じになります。

(elisp の慣習的にはアレですが、増減させやすいのを優先させてこう書いています…)

type: github は、下記の通り使えない人もいるので注意です。
他の type でのインストール方法やオプションについては、他の recipe を参考にするか、el-get-custom.el にオプションの説明があるので参照してください。

el-get バージョンの違い

現在の安定版である 3.stable ブランチと開発が進んでいる master ブランチには大きな差があります。elisp 取得コマンドその他がそれぞれ別ファイルに分けられたことで拡張しやすくなり、構造が大きく変わっています。また、el-get の管理用ファイルである .status.el の扱いにも大きな変更があります。
ちなみに取得コマンドでは、 3.stable のころから git による取得が出来ましたが、上記した github 用コマンドは master ブランチにしかありません。
rcp ファイルもかなり差があるので、多少の不具合が起きるかもしれない、ということが我慢できるなら開発版を使うのが個人的にオススメです。
ちなみに master ブランチをインストールする elisp は以下の通り。

以上、現段階における el-get をある程度まとめてみました。
el-get 使う人が増えて、rcp ファイルももっと充実して、快適な Emacs ライフの一助になれれば良いなと思います!
私ももっと貢献して、使いやすい el-get を作る手伝いを続けていきたいと思います。

最後に抜粋した私の el-get 設定を…