基本的にはvim-pyenvを使えば、pyenvのsys.pathが追加される。
追加されるので、例えばjedi-vimの補完でpyenv以下のライブラリが補完されるようになる。
vim-pyenvの仕組み
sys.pathが追加される仕組みは、pyenv_vim.pyのこの部分
# execute the external python and get the sys.path valueargs=[python_exec,'-c','import sys; print("\\n".join(sys.path))']
で、if_pythのpythonではなく、外部コマンドでpyenvのpythonを呼ぶことで、pyenvのsys.pathを取得して、それをsys.pathの先頭に追加している。
たとえば、pyenvで
$ pyenv global
3.6.0
を設定していて、適応前に
:py3 import pprint
:py3 pprint.pprint(sys.path)
['/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python36.zip','/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6','/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload','/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages','_vim_path_']
な状態で、ここからPythonのファイルを開いて、vim-pyenvが適応されると
:py3 pprint.pprint(sys.path)
['/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/davidhalter/jedi-vim','','/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python36.zip','/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python3.6','/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python3.6/lib-dynload','/Users/tmsanrinsha/.pyenv/versions/3.6.0/lib/python3.6/site-packages','/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/lambdalisue/vim-pyenv','/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/davidhalter/jedi-vim','/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python36.zip','/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6','/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload','/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages','_vim_path_']
のようにpyenvのsys.pathが追加される(それとは別に、pythonで使うVim pluginのsys.pathも追加されている)
追加なので、systemでインストールされたライブラリも補完候補として出る。消してくれたほうがいいかも。
pathが追加されるだけで、Vimが使う内部のPythonが変更されることはない。
:py3 print(sys.version)
3.6.0 (default, Dec 24 2016, 08:01:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
補完する上で問題はなさそう。
MacVim-KaoriYa使用時の注意点
MacVim-KaoriYaではPython2とPython3を同時に使うことはできない。例えば、:py print('hello')
した後に:py3 print('hello')
すると
:py3 print('hello')
E837: このVimでは :python を使った後に :py3を使えません
E263: このコマンドは無効です,ごめんなさい: Pythonライブラリをロードできませんでした.
となる。もし、
vim-pyenv: Failed to activate "3.6.0". Python version of the env is not supported in this Vim.
のようなエラーが出る場合は、どこかですでにPython2が呼ばれている可能性がある。また:py
を使わなくてもhas('python')
が使われるとPython2がロードされたことになる。
これについては:help has-python
に書いてある。
Note: Python の 2 と 3 の両方が利用可能で、Python が動的ロードされるようになっ
ている場合、この has() 呼び出しによってそれらがロードされます。もし、同時に
ロードできるのがどちらか一方だけだった場合、Python の 2 と 3 のどちらが利用で
きるか調べるだけで、もう一方は利用できなくなります。
よって、Python3を必ず使いたい場合は、vimrc
の最初の方で
if has('python3')endif
を書いて、先に呼び出しておく。
Python2とPython3の両方使いたい場合はKaoriYa付きでないMacVimをMacVim with Python 2.x and Python 3.xに従ってインストールすると良い。
使いたいPythonのバージョンがビルド時に指定したPythonのバージョンと違う場合
たとえば、pyenvのanaconda3-4.2.0のPythonのバージョンは
$ pyenv global
anaconda3-4.2.0
$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)
3.5.2だが、これはビルド時に指定したPythonのバージョンと違う。
:py3 print(sys.version)
3.6.0 (default, Dec 24 2016, 08:01:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
この状態で、
import numpy as np
np.
と打つと、np.
でjediで補完が効くときに落ちる。set pythonthreedll
を使い、anaconda3-4.2.0のdllに変更
set pythonthreedll=$HOME/.pyenv/versions/anaconda3-4.2.0/lib/libpython3.5m.dylib
しても、:py3
を使った時点で落ちる。このようにビルド時に指定したPythonと違うバージョンのPythonを使おうとすると落ちるので、ビルドし直す必要がある。
MacVim-KaoriYaの設定を変更してビルドする
anaconda3-4.2.0のPythonのバージョンが3.5.2なので、3.5系のPythonが使えるVimをビルドすることを例にする。
MacVim with Python 2.x and Python 3.xをみると、pyenvで--enable-shared
をしてインストールする必要があるらしいが、anaconda3-4.2.0ではそのオプションが効かないっぽいので、同じバージョンのPythonがインストールされる3.5.2をインストールすることにする。
$ PYTHON_CONFIGURE_OPTS="--enable-shared" \
LDSHARED="clang -bundle" \
LDCXXSHARED="clang++ -bundle" \
BLDSHARED="clang -bundle -lpython3.5m" \
pyenv install 3.5.2
MacVim-KaoriYaのビルドの仕方はBuilding · splhack/macvim-kaoriya Wikiに書いてあるので、ここを参考にする。
$ brew tap splhack/splhack
$ brew edit macvim-kaoriya
するとMacvim-kaoriya.rbがEditorで開かれるので、vi_cv_path_python3とvi_cv_dll_name_python3を3.5.2のものに変更する。
ENV.append'vi_cv_path_python3',"/Users/tmsanrinsha/.pyenv/versions/3.5.2/bin/python"ENV.append'vi_cv_dll_name_python3',"/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/libpython3.5m.dylib"
その後、以下を実行してインストールする。
$ brew tap universal-ctags/universal-ctags
$ brew install --HEAD universal-ctags
$ brew link universal-ctags
$ brew install --HEAD cmigemo-mk
$ brew uninstall macvim-kaoriya # すでにインストールしているとき$ brew install --HEAD macvim-kaoriya
$ rm -r /Applications/MacVim.app # すでにあるとき$ brew linkapps # /Applications/MacVim.appからsymlinkを貼る
Vimを立ち上げて確認。
:py3importpprint:py3pprint.pprint(sys.path)['/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python35.zip','/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5','/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5/plat-darwin','/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5/lib-dynload','/Users/tmsanrinsha/.pyenv/versions/3.5.2/lib/python3.5/site-packages','_vim_path_']:py3print(sys.version)3.5.2(default,Jan282017,13:29:58)[GCC4.2.1CompatibleAppleLLVM8.0.0(clang-800.0.42.1)]
これでpyenvの3.5.2でもanaconda3-4.2.0でも使えるようになった。
vim-pyenvを使わない
頻繁にpyenvで変更しないのであれば、vim-pyenvを使わずに、vimrcに$PYTHONHOME
を設定してやるだけでもよい。
let $PYTHONHOME='/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0'
これで、anaconda3-4.2.0の方を見るようになる。
:py3 import pprint; pprint.pprint(sys.path)
['/Users/tmsanrinsha/.cache/vim/dein/repos/github.com/davidhalter/jedi-vim',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python35.zip',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/plat-darwin',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/lib-dynload',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/Sphinx-1.4.6-py3.5.egg',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/aeosa',
'/Users/tmsanrinsha/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg',
'_vim_path_']
$PYTHONHOME
はPythonをロードするときに一度だけ参照されるようなので、ロード後に変更してもsys.pathは変わらない。
Python2とPython3両方使える環境のときは、Building · splhack/macvim-kaoriya Wikiに書いてあるようにvimrcに
let $PYTHONHOME=$HOME."/.pyenv/versions/2.7.11"set pythondll=$HOME/.pyenv/versions/2.7.11/lib/libpython2.7.dylib
pyimportsyslet $PYTHONHOME=$HOME."/.pyenv/versions/3.5.1"set pythonthreedll=$HOME/.pyenv/versions/3.5.1/lib/libpython3.5m.dylib
py3 import sys
のように書く。但し、これだと最終的な$PYTHONHOME
の値がPython3用になるので、ここからquickrunで外部のPython2を呼び出そうとすると、失敗する。
vim-pyenvに任せるのが無難かなぁ。
まとめ
- vim-pyenvを使うとpyenvで使っているsys.pathを追加することができる
- ただし、systemのsys.pathが残るので、systemで使っているライブラリも補完対象になる
- if_pythで使われるPythonは変更されない(ただし、問題はなさそう)
- MacVim-KaoriYaではPython2とPython3を同時に使うことはできない
- 使いたい方をvimrcの先頭でロードしておいたほうがよい
- KaoriYa付きでないMacVimなら同時に使える
- build時のPythonとバージョンが違うPythonは扱うことが出来ないので、再buildする