neovim と pyenv が同時にあると困る。
pyenv で version を切り替えた後に neovim を使おうとすると python3 系のpip モジュールが見つからなくて困る。
問題をもうちょっと詳しく
次のような状態になると、neovim がpython3 ネーヨ。とエラーになる。
pip install X.x.x pip local X.x.x nvim /path/to.py ## 動くには動くがneovim モジュール見つからない
原因と経緯
なんでこんな事が起きるのか。
- neovim でアレコレするには python3 が必要 ( pip install neovim )
- python3 は pyenv で管理されている。
- pyenv でバージョンを切り替える。
- pyenv local / virtualenv 環境下に pip install neovim しないと neovim がエラーになる
python3とneovim のプラグインを諦めて使うしないかなという解決策で凌いでいたが限界。
pyenv install
に neovim.egg を入れていたけどそれも面倒。
解決策 neovimが virtualenv を使えばいいんだ。
nvim 側が、virtualenv のpython3を使えばいいんだと気づく。
neovim 専用の virtualenv を作り、nvim は init.vim で virtualenv を参照すればいい。
やりかた
pyenv を使って nvim 専用の virtualenv を作る。
必要なものをインストール
さいしょに、必要になるvenvを用意する。
pyenv と pyenv-virtualenv は brew でぱぱっと入れた。
brew install pyenv pyenv-virtualenv
venv を準備する。
pyenv virtualenv 3.7.2 nvim-python3 pyenv activate nvim-python3 pip install neovim
nvim 側が venv を使うようにする。
nvim 側でシェルから渡される $PYENV_ROOT の環境変数を用いて、python3 を指し示す。
~/config/neovim/init.vim
~/config/neovim/init.vim または ~/config/nvim/init.vim
"" for only neovim. in pyenv virtualenv named 'nvim-python3' if has('nvim') && isdirectory( $PYENV_ROOT."/versions/nvim-python3" ) let g:python3_host_prog = $PYENV_ROOT.'/versions/nvim-python3/bin/python' endif
私は、設定をvim/neovim で適当にコピペで使いまわしつつ vimrc を あちこちで使い回せるように if 文を入れました。
最後に :checkheath
:checkhealth
まぁ、起動するとエラーならなきゃOKですが。念の為。
コレの設定による効果
pyenv 切り替え後で neovimが壊れるとか気にしなくていいんです。
更新やインストールに対する心理的負荷が大幅に軽減されました。
まとめ
Python2.x 系のサポートを有効にする。
pyenv virtualenv 2.7.17 nvim-python2 pyenv activate nvim-python2 pip install --upgrade pip pip install neovim pipenv which python
Python3.x系のサポートを有効にする
pyenv virtualenv 3.7.4 nvim-python3 pyenv activate nvim-python2 pip install --upgrade pip pip install neovim pipenv which python
init.vim に追記する。
"" for only neovim. in pyenv virtualenv named 'nvim-python2' if has('nvim') && isdirectory( $PYENV_ROOT."/versions/nvim-python3" ) let g:python_host_prog = $PYENV_ROOT.'/versions/nvim-python2/bin/python' endif "" for only neovim. in pyenv virtualenv named 'nvim-python3' if has('nvim') && isdirectory( $PYENV_ROOT."/versions/nvim-python3" ) let g:python3_host_prog = $PYENV_ROOT.'/versions/nvim-python3/bin/python' endif
バージョン番号は好きな番号でいい。
2019-05-17
パス修正
2020/08/15
python2 のバージョン使って、インストールしないと Deopleteがエラーになったので追記。
2021/05/18
pyenv virtualenv のインストールについて追記