--- lang: ja --- # anyenv-lazyloadの機能しない問題 ###### tags: `anyenv` `issue` `blog` ## About this page `anyenv init`の遅延読み込みをする[anyenv-lazyload][anyenv-lazyload]が便利そうだったけど使えなかった。南無 ## anyenv initの遅延呼び出し [anyenv][anyenv]を使っているとシェル起動するたびにanyenvの長い長いロードが入ってしまう。 その問題を解決する[<i class="fa fa-github fa-fw"></i> amashigeseiji/anyenv-lazyload][anyenv-lazyload]という素晴らしいpluginがあった! だけども[fish](http://fishshell.com)未対応、残念 ~~まあシェア少ないしね……~~ だけれどもそもそもそれ以上の問題があるように思われた。 ## functionの定義が消される問題 実装として以下の出力を`eval`している - exportやら\*\*env initやら面倒なことをするfunctionをcatする - completionsをsourceする文をecho さらに、catされたfunctionは最初の一行目で`unset -f`されるので初回呼び出し以降はexportやら\*\*env initをせずに普通の\*\*envを起動する 良い実装なんだけど、その初回呼び出しがcompletionsの中で行われると自然と死ぬ。 ### 例 例えば[こういうやつ(completions/pyenv.fish)](https://github.com/pyenv/pyenv/commit/d2f210d70d214880b2573f8f0de7560a709448e6#diff-7d69f812f74189074ecccda44a02cb48R20-R22)で死ぬ ```fish=20 for cmd in (pyenv commands) complete -f -c pyenv -n "__fish_pyenv_using_command $cmd" -a \ "(pyenv completions (commandline -opc)[2..-1])" end ``` 確認してみたら[completions/pyenv.zsh](https://github.com/pyenv/pyenv/blob/master/completions/pyenv.zsh)でも死ぬことになる。(fish固有の問題じゃない!) んじゃcompletionを先にsourceしようとすると\*\*envがない!!って怒られるので、詰みなのでは……? ## 解決策(はない) 強いてあげるなら初回呼び出しの補完機能は諦めてcompletionのsourceもfunction内に記述しておく方法があるか。 または、そもそもpromptを[async](https://github.com/acomagu/fish-async-prompt)にするか(僕の環境じゃ動かないけどね) ### 先駆者兄貴達 - [もっさりしたzshを改善する方法 - Aqutras Members' Blog](http://blog.aqutras.com/entry/2016/05/12/210000) - > rbenv init - には rehash が含まれていて遅い。シェル起動毎に、rbenv rehash する必要がなければ、`rbenv init - --no-rehash` とすればよい [anyenv]: https://anyenv.github.io/ [anyenv-lazyload]: https://github.com/amashigeseiji/anyenv-lazyload
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up