Hatena::ブログ(Diary)

Memo

2012-12-03

[][] jedi.vim で使う Python の jedi を入れる簡単な方法

jedi-vim(ジュダイ-ヴィム)で2ヶ月近くハマった話 - kazy no blog


Vimmer な Pythonista が使うととても便利な jedi.vimPythonライブラリインストールする必要がある。

MacPython を使っていてかつ、homebrewMacPorts を使っている場合、システムに入ってる Python とは別のディレクトリに入る。

普段使ってる Python で easy_install や pip を使うとシステムの site-packages には入らない。


で、他の site-packages も見るようにゴニョゴニョする訳だけど、jedi.vim に限って言えばそんなメンドクサイ事しなくても、もっと簡単に使える。

jedi.vim を落とした所(最近だと大抵 ~/.vim/bundle/jedi-vim? Vundle とか neobundle とか使ってないので分からない…)で、git submodule コマンドを叩くだけ。

$ git submodule update --init

~/.vim/bundle/jedi-vim/autoload/jedi.vim を読めば分かるけど、

python << PYTHONEOF
""" here we initialize the jedi stuff """
import vim

# update the system path, to include the jedi path
import sys
import os
sys.path.insert(0, os.path.join(vim.eval('expand("<sfile>:p:h:h")'), 'jedi'))

という処理が入っている。


というわけで git submodule を使うのが簡単でお勧め。

# no title にもインストールの仕方の所に書いてある。


なお、pyflakes.vim も同様に Vimプラグイン内で sys.path に追加するような処理が書かれている。

VimPython のインターフェスを使うようなプラグインを書く場合、こういう気配り的なのも必要なのかも。

shkhshkh 2012/12/13 03:53 私もjediのインストールはsubmoduleとして入れるのが良いと思います。
上の記事で、他のsite-packagesを見る方法を伝えたのは、他のsite-packagesに入っているライブラリの補完を効かせたいのだと理解したためです。

heavenshellheavenshell 2012/12/13 21:47 id:shkh さん
ありがとうございます!

因に興味本位でお聞きしますが、Virtualenv との兼ね合いはどうしてますか?
毎回 site-packages パスを追加されてます?

virtualenv.vim のソースを少し読みましたが一応アクティブな $WORKON_HOME を動的に追加してるみたいでしたが、ライブラリの補完は上手くいかなかった。

shkhshkh 2012/12/14 00:31 id:heavenshell さんへ

こんにちは

私は、今のところvirtualenvのフックを使っています。$WORKON_HOMEにフック用のシェルスクリプトがあって、私はpreactivateという、アクティベート直前に環境名が渡されるフックを使っています。(私の場合 ~/virtualenv/preactivate です)
中身はこんな感じです。

#!/bin/bash
# This hook is run before every virtualenv is activated.
mine=/Library/Python/2.7/site-packages/mine.pth
echo -n "" > $mine
find $WORKON_HOME/$1 -type d | grep ".*site-packages$" | while read DIR
do
echo -e "${DIR}" >> $mine
done

あらかじめmine.pthを作って全ユーザに書き込み権限を与えてあります。前の環境の設定を最初のechoで消しています。この部分はpostdeactivateフックとかを使ったほうが良いかもしれません。私は面倒なのでpreactivateフックにぶち込んでますが^^;
下のサイトにフックの一覧があります。
http://virtualenvwrapper.readthedocs.org/en/latest/scripts.html#per-user-customization


vimscriptについては無知なのですが、virtualenv.vimは環境の切り替えのためにゴニョゴニョしてるだけで、sys.pathにsite-packagesを追加してるわけでは無さそうですね。この辺は本当に良く分かりません。
一応、vimscriptとして下のコードを実行すれば、アクティブな環境のsite-packagesを追加できると思います。実行前にアクティベートしておく必要がありますが。

python <<EOM
import sys, os

def findSite(arg, dirname, names):
if os.path.basename(dirname) == "site-packages":
sys.path.append(dirname)

os.path.walk(os.environ["VIRTUAL_ENV"], findSite, None)
print list(sys.path)
EOM

完全にPythonのスクリプトですね^^; それとインデントは適当に追加して下さい。

heavenshellheavenshell 2012/12/14 00:43 id:shkh さん

おお、ありがとうございます!

virtualenv.vim は site-packages というか virtualenv の bin/activate_this.py を呼んでるみたいですね。
https://github.com/jmcantrell/vim-virtualenv/blob/master/autoload/virtualenv.vim#L27

私が Virtualenv じゃなくて Virtualenvwrapper の方を使ってるからかもしれません。
ともあれ週末に少し追ってみようと思います。
色々ありがとうございます!

shkhshkh 2012/12/14 00:53 id:heavenshell さんへ

virtualenvwrapperナウいですねw
何か分かったらブログに上げてもらえると有難いです。この辺気になるので。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元