---
# System prepended metadata

title: anyenv-lazyloadの機能しない問題
tags: [blog, issue, anyenv]

---

---
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