vim-virtualenvをフォークして修正した話
遅くなりましたが、Python 3.4.0がリリースされましたね。とりあえずインストールして(手順はBeta版と同じ)仮想環境で使ってみました。普通に使うには問題ありませんでした。
私はPythonのコードはvimで書いていますが、jmcantrell/vim-virtualenvで仮想環境のpython3.4を使った時はjedi-vimを使った補完が上手く動きませんでした。というわけで、vim-virtualenvがPython3の仮想環境で上手く動かなかったので、フォークして(強引に)修正した話です。以下、python3.4は関係なく(3.3でも同じ)、vimの話です。
フォーク版: miyakogi/vim-virtualenv
具体的に上手く動かなかった部分というのは、
:!python3
などでPython3を実行するとエラーが出る(ことがある?)- 仮想環境にpip等でインストールしたパッケージがjediで参照できない(補完候補に出ない)
Windows環境ではおそらく上記の問題は出ないと思います。したがってLinux環境限定です。Macは試していませんがLinuxと同じで問題が出るのではないかと思います。
1つ目の問題の原因は余分なPYTHONPATHの設定をしているせいらしく、Issueにもあがっているのですが放置されています。
PYTHONPATH mangling breaks !supervisorctl
· Issue #20 · jmcantrell/vim-virtualenv
作者に意図が正しく伝わっていない風ですが、この議論に割って入る気もしなかったのでフォークしました。
2つ目の問題が厄介で、Windowsやpython2.7の仮想環境ではjediの補完が正常に呼び出されます。こちら(jedi.vim で virtualenv を使ってる場合の補完 - Memo)ではおそらくpythonの2系を使われているのではないかと思います(勝手な推測なので間違っていたら申し訳ありません)。
問題が出るのはWindows以外でpython2.7以外の仮想環境を使った時です。具体的にはこちら(ラフなラボ: python2.7のvirtualenv(wrapper)でpython3環境使った時のjedi-vimで補完が効かなくてハマった話)で報告されている現象です。
vim-virtualenvではvimのpythonインタフェースで仮想環境のbin
フォルダ内のactivate_this.py
というスクリプトを実行しています。このスクリプトは実行しているpythonのバージョンから追加するパスの一部を決定しているため、仮想環境のpythonのバージョン(3.x)は無視され、vimのpythonのバージョンに基づいた存在しないパス(~/.virtualenvs/[env_name]/bin/lib/python2.7/site-packages
)がPATH
に追加されてしまいます。その結果、本来追加してほしいpython3.x/site-packages
が追加されず、jediの補完候補にも出ません。なお、Windowsの場合にはsite-packagesのパスにバージョン番号が含まれないので正常なパスが追加されます。
前述のラフなラボさんのようにシンボリックリンクを作ったり、activate_this.py
の中をバージョン番号決め打ちするように少し書き換えてもjediの補完はできるようになりますが、仮想環境ごとにそれをやるのは面倒なのでvim-virtualenvの書き換えで(強引に)対応しました。書き換えといいますか、実際にはactivate_this.py
を少し修正してvim scriptに埋め込んでいます。なのでvirtualenvの仕様が変わると動かなくなる可能性があります。あと、こちらのコメント欄で指摘されているように、python2.7で実行しているjediでpython3.xのコードを読んでいるので、パッケージによってはエラーが出るかもしれません。Vim側のPythonのメジャーバージョンは切り替え可能ですが、以前の記事(Debian: vimでPythonとPython3の両方使えるようになってた(ように見えたけどそうでもなかった) - Blank File)の通り、Debian系のOSではvimでpython2系と3系を同時に利用することは困難なので、今回このような付け焼刃的な対応で済ませました。