memo

2015-12-03

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 から探索したいということであれば、この指定は意味をなさない。