bundle open を Emacs の中でやる

最近書いた Emacs の小物の紹介です。

bundle open というコマンドがあります。引数に gem の名前を渡すと、環境変数 BUNDLER_EDITOR で gem のディレクトリを開いてくれるコマンドです。gem の中に潜っていくときに役立ちます。

はじめは BUNDLER_EDITORemacsclient -nw を設定して使っていたんだけど、Emacs の中で完結したいってことで、一つ関数をこさえました。

(defun bundle-open (gem-name)
  (interactive
   (let* ((gems (shell-command-to-string "bundle list --name-only"))
          (candidates (split-string gems "\n" t)))
     (list (ido-completing-read "Gem: " candidates))))
  (find-file (s-chomp (shell-command-to-string (concat "bundle info " gem-name " --path")))))

bundle list --name-only で現在のプロジェクトの Gemfile.lock にある gem を列挙してくれます。それをリスト化して、ido-completing-read で補完しつつ選択します。 gem のディレクトリパスは bundler info GEMNAME --path で拾ってくることができます。あとはこれを find-file に渡してしまえば終わり。

私は今のところ困っていませんが、Gemfile.lock にない gem も指定できるようにするオプションがあってもいいかもしれませんね。