MacVim-KaoriYaでpyenvのPythonを使う

More than 1 year has passed since last update.

基本的にはvim-pyenvを使えば、pyenvのsys.pathが追加される。

追加されるので、例えばjedi-vimの補完でpyenv以下のライブラリが補完されるようになる。


vim-pyenvの仕組み

sys.pathが追加される仕組みは、pyenv_vim.pyのこの部分

# execute the external python and get the sys.path value

args = [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を立ち上げて確認。

:py3 import pprint

:py3 pprint.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_']
:py3 print(sys.version)
3.5.2 (default, Jan 28 2017, 13:29:58)
[GCC 4.2.1 Compatible Apple LLVM 8.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に


.vimrc

let $PYTHONHOME=$HOME."/.pyenv/versions/2.7.11"

set pythondll=$HOME/.pyenv/versions/2.7.11/lib/libpython2.7.dylib
py import sys
let $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する