ふるつき

v(*'='*)v かに

jedi-vimでpipenvから補完する

  • ファイルを開いたときにそれがpipenv環境下のファイルであればpipenvによって作られた仮想環境から補完候補を出してほしい
  • jedi-vimのロード後でも雑に環境を選びたい

をうまく実現しようとしたら、jedi-vim本体に変更を加える羽目になりました。

GitHub - theoldmoon0602/jedi-vim at theoldmoon0602

g:jedi#virtualenv_pathという変数をg:jedi#force_py_versionの代わりに使えて、let g:jedi#virtualenv_path = ~/.local/share/virtualenvs/someenv というようにpipenv --venvで返ってくるパスを代入しておくと、こちらのパスから補完してくれます。私は以下のように書いて運用しています。

" vim-plug を使っているのでこう
Plug 'theoldmoon0602/jedi-vim', {'do': 'pip install --user -U jedi'}


" ファイルのディレクトリまたは親ディレクトリのいずれかにPipfileがあればpipenv管理下としてパスをセットする
function! s:addPipenvPath()
  let pipenv_dir = expand('%:p:h')
  while pipenv_dir != '/'
    if filereadable(l:pipenv_dir . '/Pipfile')
      let venv_path = trim(system(printf("sh -c 'cd %s; pipenv --venv'", pipenv_dir)))
      let g:jedi#virtualenv_path = venv_path
      return
    endif

    let pipenv_dir = fnamemodify(pipenv_dir, ':h')
  endwhile
endfunction

augroup vimrc-python
  autocmd!
  autocmd FileType python :call s:addPipenvPath()
augroup END

別のpipenv環境下にある二つのファイルを開いたときに2つ目のファイルの環境だけを使うことになってしまうのは問題だなぁと思っていますが、小さい問題だし無視しようかなと思っています。

追記

思い切ってjedi-vim本体にPull Reqという形でコードを投げてみたら、すでにこういうことをやろうとしている(しかももっとちゃんとやろうとしている)動きはあって、 https://github.com/davidhalter/jedi-vim/pull/836 がそれに当たるみたいです。こちらが取り込まれればこの記事も不要になりますね