先日【解決】emacsとrbenvとgemにハマってる - $shibayu36->blog;の挙動確認をしていて、どうやってデバッグしたらいいかよく分からなかった。ただ、よくバグ修正する時はおかしい挙動が再現する最小構成をまず作ることから始めると思うので、Emacsだとどうやればいいか調べてみた。
最小構成のinit.elを作成する
まずは操作に支障がないくらいのinit.elを作成してみた。minimum-init.elとして作成した。こういう感じ https://github.com/shibayu36/emacs/blob/master/emacs.d/minimum-init.el
基本的には以下の様な設定を入れた。
- load-pathくらいは通す
- packageとel-getに入っているものをすぐにrequire出来る状態にはしておく
- 操作に支障がない程度にキー設定や文字コード設定などを行う
- 最小バグを再現するファイルを作るためにopen-junk-fileくらいは入れておく
最小構成のelispだけ読んでemacsを起動する
emacsの起動コマンドには、デフォルトのinit.elを読み込まないオプション(-Q)と、特定のelispファイルを読み込むオプション(-l)がある。ので、これを使うことでminimum-init.elだけ読むことができる。
$ emacs -Q -l ~/.emacs.d/minimum-init.el
/Applications/Emacs.app/Contents/MacOS/Emacs -Q -l ~/.emacs.d/minimum-init.el
バグを再現できる最小のelispを作成する
ここからはopen-junk-fileで作ったファイルに、バグを再現するための最小のelispを作成する。
M-x open-junk-file ~/junk/2014-01-16-011134.el
それでこのファイルに再現コードを書いていく。前のgemのpathの話だと試行錯誤の結果、以下の様な最小の再現コードが出来た。
(let ((envs '("GEM_HOME" "GEM_PATH"))) (exec-path-from-shell-copy-envs envs))
あとはこのバッファで
M-x eval-buffer
すると、elispをloadできる。こういうので試しながら再現するコードを作ってく。
これで問題を絞り込めるので、あとは直すだけ。