jedi.vim がどのようにして python ライブラリを探索するか
vim で python のいい感じの補完を提供してくれる plugin, jedi.vim だが、 「何故か補完がうまく動きません」、という話をちょくちょく聞く。
ここでは 2015-12-02 時点での jedi.vim の python ライブラリ探索手順について調べたことを記す。
jedi
まずは、 jedi.vim が内部で使用しているライブラリ、 jedi のライブラリ探索方法について。
jedi がライブラリを探索する場所は、
jedi を実行している python の
sys.path環境変数
$VIRTUAL_ENVが定義されている場合は、 上記に加えて$VIRTUAL_ENV/lib/pythonX.Y/site-packages(
X.Yは jedi を実行している python のバージョン。)
jedi.vim
jedi.vim は上記 jedi を vim 組み込みの python インタプリタ (:python or :python3 コマンド) を使って読み込む。 よって、上で「 jedi を実行している python 」と書いた箇所は、 vim がどのバージョンの
python とリンクしているのかによって決定されることになる。
:python と :python3 の両方が利用可能な環境でどちらのコマンドを使用するかは、 python コマンドがどちらのバージョンかというのを元にした自動判定か、 もしくは g:jedi#force_py_version
に設定された値をによって決定する。
「何故か補完がうまく動きません」
上記を踏まえて、問題が起きるケースというのを考える。
基本的には vim がリンクしている python の path から探索されることになる。 したがって、それ以外の python バージョンや、 同じバージョンでもどこか別の場所に自分でインストールした python などは対象にならない。
また、
pythonコマンドでどこに置かれた python が起動するかというのは関係がない。 (共有ライブラリのリンクがどうのこうのの話なので$PATH環境変数がどうなっているかは関係ない。)$VIRTUAL_ENVが設定されている場合は、 jedi が自動で path を追加してくれるのだが、 これは vim がリンクしている python と virtualenv のものとでマイナーバージョンまで一致しないと成功しない。 (存在しない path を指すことになるので、意味がない。)vim の python は 2.7 だが virtualenv は python 3.4 で作ったというケースではダメだし、 同じ python3 系でも 3.4 と 3.5 でずれていると探索対象とはならない。
vim が python2系・3系両方とリンクされているような環境で、どちらかとバージョンが一致しているのだが、 別の側の python インタプリタが使用されてしまっている場合。
この場合は
g:jedi#force_py_versionで正しい python を指定することで動作するようになる。ただし、
g:jedi#force_py_versionで切り替えられるのは:pythonと:python3のどちらを使用するかということであって、 任意のバージョン・インストール位置の python に切り替えられるということではない。vim がリンクしているものとは異なるバージョンの python から探索したいということであれば、この指定は意味をなさない。