Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

MacVim-KaoriYaでpyenvのPythonを使う

$
0
0

基本的には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に

.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する

Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>