Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

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


具体的に上手く動かなかった部分というのは、

  1. :!python3などでPython3を実行するとエラーが出る(ことがある?)
  2. 仮想環境に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ではvimpythonインタフェースで仮想環境のbinフォルダ内のactivate_this.pyというスクリプトを実行しています。このスクリプトは実行しているpythonのバージョンから追加するパスの一部を決定しているため、仮想環境のpythonのバージョン(3.x)は無視され、vimpythonのバージョンに基づいた存在しないパス(~/.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系を同時に利用することは困難なので、今回このような付け焼刃的な対応で済ませました。