MacVim-KaoriYaでpyenvのPythonを使う

基本的には[vim-pyenv](https://github.com/lambdalisue/vim-pyenv)を使えば、pyenvのsys.pathが追加される。
追加されるので、例えば[jedi-vim](https://github.com/davidhalter/jedi-vim)の補完でpyenv以下のライブラリが補完されるようになる。

# vim-pyenvの仕組み

sys.pathが追加される仕組みは、[pyenv_vim.py](https://github.com/lambdalisue/vim-pyenv/blob/master/pyenv_vim.py#L32-L33)のこの部分

```python
# 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
```

を設定していて、適応前に

```vim
: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が適応されると

```vim
: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')`すると

```vim
: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`の最初の方で

```vim
if has('python3')
endif
```

を書いて、先に呼び出しておく。

Python2とPython3の両方使いたい場合はKaoriYa付きでないMacVimを[MacVim with Python 2.x and Python 3.x](https://gist.github.com/splhack/4ec93591aec286beac496bbd5cc8d764)に従ってインストールすると良い。

# 使いたい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に変更

```vim
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](https://gist.github.com/splhack/4ec93591aec286beac496bbd5cc8d764)をみると、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](https://github.com/splhack/macvim-kaoriya/wiki/Building)に書いてあるので、ここを参考にする。

```bash
$ brew tap splhack/splhack
$ brew edit macvim-kaoriya
```

するとMacvim-kaoriya.rbがEditorで開かれるので、vi_cv_path_python3とvi_cv_dll_name_python3を3.5.2のものに変更する。

```ruby
    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"
```

その後、以下を実行してインストールする。

```bash
$ 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を立ち上げて確認。

```python
: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](https://github.com/splhack/macvim-kaoriya/wiki/Building)に書いてあるようにvimrcに

```vim:.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する