それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

neovim で python3 の環境を安定的に運用するために pyenv/virtualenev 化した。

neovim と pyenv が同時にあると困る。

pyenv で version を切り替えた後に neovim を使おうとすると python3 系のpip モジュールが見つからなくて困る。

問題をもうちょっと詳しく

次のような状態になると、neovim がpython3 ネーヨ。とエラーになる。

pip install X.x.x
pip local X.x.x
nvim /path/to.py ##  動くには動くがneovim モジュール見つからない

原因と経緯

なんでこんな事が起きるのか。

  1. neovim でアレコレするには python3 が必要 ( pip install neovim )
  2. python3 は pyenv で管理されている。
  3. pyenv でバージョンを切り替える。
  4. 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

f:id:takuya_1st:20190312174206p:plain

まぁ、起動するとエラーならなきゃ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 のインストールについて追記

参考資料