blog.euxn.me

neovim はどのように python を解決するか ~ pyenv と python2 ~

2017-11-19 Sun.

結論

  • neovim は pyenv がある場合に shims ではなく実態を参照しに行くため遅くない(以前は shims を参照してから実態を解釈していたためか、初期ロードが遅かった)
    • pyenv local を使用している場合、local で指定している python を参照する
  • global の python3 を常に指定したい場合は g:python3_host_prog に実態を指定する
    • g:python3_host_prog が指定されている場合、pyenv による解決よりも優先される
    • pyenv 環境と互換を取る場合、次のように指定することで動作し、遅延もほとんどない
    • let g:python3_host_prog = system('type pyenv &>/dev/null && echo -n "$(pyenv root)/versions/$(cat $(pyenv root)/version | head -n 1)/bin/python" || echo -n $(which python)')
  • python2 の解決を防ぐことで初期ロードを早くする
    • let g:python_host_prog = '' と明示的に指定することで python2 を明示的に無効化できる
    • pyenv で python2 が設定されていると python2 を解決してしまうため、上記を指定する必要がある
    • global に python2 がない場合でも確認を行うためかロードに 0.2ms ほど遅くなるため、上記を指定する方が高速になる
    • :CheckHealth コマンドで python2 の情報を確認できる。

背景

以前 neovim は pyenv を経由して python を解決すると起動に時間がかかっていました。

また、pyenv に python2 があるとそちらも使用し、pip で neovim ライブラリを入れることを求められました。

今回その環境を見直す課程で neovim のソースコードを確認し、上記のような挙動であることを検証しました。

runtime/autoload/health/provider.vimlet python_bin = s:trim(s:system([pyenv, 'which', pyname], '', 1)) という記述があることからも実態を参照していることがわかります。

本稿の速度検証は $ nvim --startuptime /tmp/nvim-startuptime main.py コマンドにて、python に依存するプラグインのロードを含めた時間で検証しました。

Other Works
2024-12-01 Sun.
OpenAPI Spec を出力できる DSL、TypeSpec の実践例
- ドワンゴ教育サービス開発者ブログ

2024-11-16 Sat.
型付き API リクエストを実現するいくつかの手法とその選択
- TSKaigi Kansai 2024

2024-09-10 Tue.
corepack が標準同梱じゃなくなる未来、 mise でパッケージマネージャを管理する
- Zenn

2024-09-10 Tue.
言語環境の管理は *env や *vm を超えて、 mise へ
- Zenn

2024-06-28 Fri.
TypeSpec を使い倒してる
- Kyoto.js 22

2024-05-11 Sat.
Powerfully Typed TypeScript
- TSKaigi 2024

2024-05-10 Fri.
pnpm の node_modules を探検して理解しよう
- ドワンゴ教育サービス開発者ブログ

2024-03-17 Sun.
neverthrow で局所的に Result 型を使い、 try-catch より安全に記述する
- Zenn

2023-12-20 Wed.
レガシーブラウザ向けのビルドオプションを剪定する
- ドワンゴ教育サービス開発者ブログ

2023-05-26 Fri.
Next.js で dynamic import を使い Client だけで動かす Component を実現する
- Zenn

2023-05-02 Tue.
Node.js でファイル名から拡張子を取り除く/取り出すために path.parse を使う
- Zenn

2023-02-27 Mon.
WSL2 で外部からアクセス可能にするために bridge mode を有効にする
- Zenn

2023-01-26 Thu.
init.vim & dein から init.lua & lazy.nvim へ、シンプル設定で移行した
- Zenn

2023-01-13 Fri.
kindle の本をブクログ形式の csv でエクスポートする@2023初春
- Zenn

2023-01-10 Tue.
自宅サーバの移設に際して docker から nerdctl に移行した
- Zenn

2023-01-10 Tue.
自宅サーバを rootless に移行した際のトラブル対応
- Zenn

2021-11-11 Thu.
並列実行した Promise で throw されても全てハンドルしたいときの方法(allSettled, finally, etc...)
- Zenn