virtualenv上のpythonをquickrunで呼ぶ

quickrun

現在のバッファの内容をファイル名に結びついた言語のコマンドで実行してくれる(e.g. foo.pyならpython)
https://github.com/syohex/emacs-quickrun

motivate

pythonを書くときには、virtualenvでプロジェクトごとに環境を分けている。
なので以下のようなことがquickrunでもできたら良いなと思った。

  • ~/venvs/poject1/foo/bar.pyでは~/venvs/project1/bin/pythonを利用して欲しい。
  • ~/venvs/poject2/boo/boo.pyでは~/venvs/project2/bin/pythonを利用して欲しい。

一方で、quickrunのpythonの設定を見ると、:command "python"とpython決め打ちだったのであまり良くない。

how to solve it

実際にコードを読んでみたら、`quickrun/eval-paramater'が期待どおりの実装になっていた。
どういうことかというと、:commandに関数を渡せる。(渡した場合渡された関数を評価した結果が使われる)

こういうことができる。*1

("python" . ((:command . (lambda () (print "hey") "python")) (:compile-only . "pyflakes %s")
             (:description . "Run Python script")))
code

現在のディレクトリからvirtualenv上のpythonを探し出して使うように設定を変更。

`quickrun/virtualenv-setup'を評価してあげると有効になる。

e.g.

以下のような場合でもM-x quickrunが動作するようになった。

以下のような場合

普通のpythonだとモジュールが足りなくて実行できないような例。virtualenv上のpythonだと実行できる。

$ pwd
/home/podhmo/.virtualenvs/my/sandbox

$ python joinmodel.py
Traceback (most recent call last):
  File "joinmodel.py", line 1, in <module>
    import sqlahelper
ImportError: No module named sqlahelper

$ ~/.virtualenvs/my/bin/python joinmodel.py
name Person.name foo
age Person.age 20
skill Person.skill fire
id Person.id None

*1:もちろん表示されるheyには何の意味もない