Cask

昨年 ELPA で elisp を管理 - naoyaのはてなダイアリー に書いたとおり、昨今は Emacs にもパッケージ管理システムが搭載されいて、どこからか elisp をコピペしてきてその後管理できなくなる・・・みたいなことはなくなった。

ただ、じゃあ ELPA で全て解決したかというとそんなことはなくて、ELPA はパッケージのインストール自体は簡単にしてくれるけれども、それだけだった。

elisp の管理も Bundler のように入れたいパッケージ一覧を書いて bundle install すれば全部まとめて入るみたいな、そういうのが欲しい・・・と常々思っていた。

と思っていたら、Cask というのを見つけた。これがずばりそのものだった。

(source gnu)
(source melpa)
(source marmalade)

(depends-on "ag")
(depends-on "anything")
(depends-on "auto-complete")
(depends-on "browse-kill-ring")
(depends-on "color-theme")
(depends-on "elscreen" :git "git@github.com:knu/elscreen.git")
(depends-on "flycheck")
(depends-on "git-gutter")
(depends-on "pbcopy")
(depends-on "popup")
(depends-on "popwin")
(depends-on "powerline")
(depends-on "quickrun")
(depends-on "recentf-ext")
(depends-on "zlc")

;; prog modes
(depends-on "coffee-mode")
(depends-on "go-mode")
(depends-on "js2-mode")
(depends-on "json-mode")
(depends-on "less-css-mode")
(depends-on "motion-mode")
(depends-on "puppet-mode")
(depends-on "rhtml-mode")
(depends-on "ruby-mode")
(depends-on "sass-mode")
(depends-on "slim-mode")

(depends-on "rubocop")
(depends-on "ruby-block")
(depends-on "ruby-electric")
(depends-on "ruby-end")

(depends-on "go-autocomplete")

こんな感じで Cask というファイルを用意しておいて

$ cask

これで、.cask ディレクトリ以下に所望のパッケージがインストールされる。

$ cask update

でまとめてパッケージをアップデートすることもできる。

途中

(depends-on "elscreen" :git "git@github.com:knu/elscreen.git")

とあるように、パッケージソースを GNU や melpa ではなく Github レポジトリにできる。これがかなり嬉しい。

Cask で入れた elisp にロードパスを通すには二つやり方があって

  • cask exec emacs で起動する
  • init.elcask-initialize を呼んでやる

の二つ。

元々 Cask は Bundler に同じく elisp の依存関係を特定のディレクトリ内に封じ込めてやって、ライブラリの開発などで無用のトラブルを避けるために開発されたもの。前者はそのユースケースのための方法。

一方、Cask は普段使いの Emacselisp 管理にも使えて、後者がその方法だと思われる。

Cask をワンライナー ($ curl -fsSkL https://raw.github.com/cask/cask/master/go | python) で入れた場合

$ cask init

すると ~/.cask ディレクトリが作成されてそこに cask.el が入ってるので、これを使って

;; cask
(require 'cask "~/.cask/cask.el")
(cask-initialize)

と、init.el の中で呼んでやる。すると普段使いの emacs~/.emacs.d/.cask ディレクトリ以下を読むようになる。このディレクトリ用の Cask ファイルは ~/.emacs.d/Cask になる。

あとはこの Cask ファイルと init.el を git で管理すれば十分、ということになる。実際には Cask で入れられないパッケージ化されてない elisp は相変わらずロードパスに置かれたままだけど、その辺はおいおい整理していこう。

上記手順は記憶を頼りに適当に書いてるので詳しくは http://cask.github.io/usage.html などを参照されたし。

Emacs を使い始めてはや15年、ようやくまともな elisp 管理ができるようになった。