vim + jedi + virtualenv + vim-virtualenvで補完が効かなくてハマった話

タイトルの通り、vimでpythonを書きたくて vim + jedi + virtualenv + vim-virtualenv で環境を作ったものの、うまいこと補完がされなくて困ってました。とっても。何週間かハマってemacsに乗り換えようと何度も思ったけどようやっと解決したのでメモ。

解決方法がひっじょーーーーにださいのでうまい方法があれば教えてください。 (vim-virtualenvにpatchが正当かもしんない)

発生条件

  • システムのpythonとvirtualenvで入れたpythoのバージョンが違う
[baba@bbair2012 ~]$ /usr/bin/python -V
Python 2.7.2
[baba@bbair2012 ~]$ ~/.virtualenvs/sandbox2.6/bin/python -V
Python 2.6.8

対策

正しいバージョン番号へシンボリックリンクを作成

workonした状態で↓を実行すればOK!

cat <&1 | sed -E 's/.*([0-9]\.[0-9])\..*/\1/')
VIRTUALENV_PYTHON_VERSION=\$(python -V 2>&1 | sed -E 's/.*([0-9]\.[0-9])\..*/\1/')
VIRTUALENV_LIB_PREFIX=\$(which python | sed -E 's@(.*)/bin/python@\1/lib/python@')
ln -s \${VIRTUALENV_LIB_PREFIX:?}\${VIRTUALENV_PYTHON_VERSION:?}  \${VIRTUALENV_LIB_PREFIX:?}\${SYSTEM_PYTHON_VERSION:?} 
FIN

・・・というのだけだとさすがにアレなので少し丁寧に書くとこんなかんじ。

[baba@bbair2012 ~]$ cd ~/.virtualenvs/sandbox2.6/lib/
[baba@bbair2012 lib]$ ls -al
total 0
drwxr-xr-x   3 baba  staff   102  5 11 15:29 .
drwxr-xr-x   5 baba  staff   170  5  3 10:09 ..
drwxr-xr-x  48 baba  staff  1632  5  3 10:09 python2.6
[baba@bbair2012 lib]$ ln -s python2.6 python2.7
[baba@bbair2012 lib]$ ls -al
total 8
drwxr-xr-x   4 baba  staff   136  5 11 15:29 .
drwxr-xr-x   5 baba  staff   170  5  3 10:09 ..
drwxr-xr-x  48 baba  staff  1632  5  3 10:09 python2.6
lrwxr-xr-x   1 baba  staff     9  5 11 15:29 python2.7 -> python2.6

ちなみに動作確認方法は↓。 これでvirtualenv配下の lib/python2.7/site-packages/setuptools-0.6c11-py2.6.egg とかが読み込まれてればokです。

[baba@bbair2012 ~]$ workon sandbox2.6
(sandbox2.6)[baba@bbair2012 ~]$ vim -c "set filetype=python" -c "python import sys;print sys.path"

この問題はまぁvirtualenvの activate_this.py がダサいといえばダサいんだけど、それよりもコンパイル時に指定したpythonを固定で使い続けちゃうvimがイケてないなぁ。なんだかなぁ。なんだかねぇ。。。。

ともあれ、これでまだvimを使える。ヨカッタヨカッタ

Python 

See also