memo

2015-12-03

jedi.vim が動かないことがあるのを何とかするため、プロセスを分離してみた

前回 の続き。

前回は jedi がどのようにライブラリを探索するのかと、 jedi.vim が jedi をどうやって利用しているのかを調べたのでした。

そして、 jedi.vim は基本的に vim がリンクしている python からしか探索しないということを知ったのでした。

さて、そうは言っても現実に人々は複数の python インタプリタを使い分けています。 vim が python 2.7 とリンクしている中 python 3.4 の virtualenv を作ってその中でコード書くだとか、 vim が python 3.4 だけど python 3.5 の virtualenv を作ったりとか、色々したいわけです。

そこで、この問題を解決する方法として、 jedi.vim から jedi 実行部分を別プロセスとして分離し、 そちらは任意の python インタプリタで実行できるようにする、という案を試みています。

https://github.com/nakamuray/jedi-vim/tree/rpc

前回調べたとおり、 jedi はそれを実行している python のパスからライブラリを探索するので、 jedi 実行部分をユーザーが期待している python インタプリタで行えるようにすれば、 ユーザーの期待する補完結果が得られることになります。 jedi.vim はそのプロセスと通信して、ファイル名やカーソル位置などの情報を送信し、 補完結果を受信して画面に表示するという動作になります。

今のところ、「ユーザーが期待している python インタプリタ」というのは python と打って起動するコマンドのことである、という想定の元の実装となっています。 virtualenv などを利用している場合は通常そのようになっているかと思いますが、 そうでない場合でも $PATH をどうにかするとかすればなんとかなるかと思います。

とりあえず linux と OSX で、 vim がリンクしているものと異なるバージョンの virtualenv 内でも 補完や定義元ジャンプなどが動作することは確認済みです。