読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

バグが起こる最小構成のemacs設定を作る

 先日【解決】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

cocoa emacsを使ってるならこういう感じ。

/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できる。こういうので試しながら再現するコードを作ってく。

これで問題を絞り込めるので、あとは直すだけ。

まとめ

今回は

  1. 最小構成のinit.elを作る
  2. 最小構成のelispだけ読んでemacsを起動する
  3. バグを再現できる最小のelispを作成する

という手順で、問題を絞ってくというのを書いてみた。

こういうの自分でelisp書くときも他の拡張と問題を切り分けて確認したり出来て便利です。