Neovimでvirtualenvを使うときのpython_host_progの設定
 
Posted on  
    480 words,
 2 minutes to read
   この記事は、最終更新日から 8 年以上経過しています。 情報が古い可能性があります。 
 neovimでpythonのvirtualenvを使うときのpython_host_progの設定についてです。
neovimで補完などを有効化する場合、pythonのneovimパッケージをインストールしていると思いますが、デフォルトでvirtualenvを作ると、そのneovimパッケージが入っていません。
そこで、neovimパッケージをvirtualenvにインストールして、python_host_progにvirtualenvのpythonを指定するのが一般的かと思います。参考
しかし、この方法だと、pythonの仮想環境を作る度に、neovimパッケージをインストールする手間が発生してしまいます。
そこで、virtualenvを作成したときのデフォルトのパッケージにneovimなどを追加するようにし、python_host_progには、現在のvirtualenvのpythonが指定されるようにしたいと思います。
virtualenv作成時のデフォルトのパッケージ追加
まず、追加したいパッケージをあるディレクトリにインストールします。この時、python2用とpython3用の両方を準備しておくのが良いと思います。
# python2用のディレクトリ作成mkdir -p ~/.virtualenvs/deps
# python3用のディレクトリ作成mkdir -p ~/.virtualenvs/deps3
# デフォルトでvirtualenvに追加したいパッケージをインストール(python2)pip2 install -U --target ~/.virtualenvs/deps <インストールしたいパッケージ(neovim jedi flake8など)>
# デフォルトでvirtualenvに追加したいパッケージをインストール(python3)pip3 install -U --target ~/.virtualenvs/deps3 <インストールしたいパッケージ(neovim jedi flake8など)>次に、virtualenv作成時に、これらのパッケージも参照するように設定します。以下のように ~/.virtualenv/postmkvirtualenv を編集します。
# find directorySITEDIR=$(virtualenvwrapper_get_site_packages_dir)PYVER=$(virtualenvwrapper_get_python_version)
# create new .pth file with our path depending of python versionif [[ $PYVER == 3* ]];then    echo "$HOME/.virtualenvs/deps3/" > "$SITEDIR/extra.pth";else    echo "$HOME/.virtualenvs/deps/" > "$SITEDIR/extra.pth";fiこれでvirtualenv作成時に、上記でインストールしたパッケージも読み込まれます。
neovimのpython_host_progの設定
続いて、neovimで、virtualenvが有効な場合は、virtualenvのpythonを参照するように指定します。
let g:python_host_prog = '/usr/bin/python2'let g:python3_host_prog = '/usr/bin/python3'
if exists("$VIRTUAL_ENV")  if !empty(glob("$VIRTUAL_ENV/bin/python3"))    let g:python3_host_prog = substitute(system("which python"), '\n', '', 'g')  else    let g:python_host_prog = substitute(system("which python"), '\n', '', 'g')  endifendif