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