zshの補完関数ロードを補完するときまで遅延させる
これまでの問題点
zshの補完機能は便利だが、補完関数出力と読み込みを.zshrcで行ってしまうと、数の分だけ遅くなる
zsh-deferやzinitのturboを使うことで、プロンプトが表示された後まで読み込みを遅延させることはできる が、それが実際に読み込まれて使用可能になるまでは、同じ時間がかかるのでそこまで意味が無い
$ gh completion -s zsh > _zshみたいにして、補完関数出力を事前にやっておくこともできるが、コマンドのバージョンとの兼ね合いが難しい
パッケージマネージャの機能でインストール後に再生成できるといいんだけど、aquaにはそれが無い 面倒なので、実際に実行されるコマンドのバージョンで生成されるcompletionが確かに使われるようにしたい
tabキーを押して補完が必要になった際に補完関数を読み込むようにすることで、その辺を解決できる。
補完関数が必要になるのは補完しようとした時なので、それまでは必要無い
複数のコマンドの補完を一斉に読み込もうとするから遅いのであって、コマンドごとに読み込むならそこまで遅くない
ghの場合はこんな感じ
ghコマンドの補完関数として、補完を読み込む関数を登録する
unfunctionで_load_gh_completionを削除しているので、2回目以降はeval "$(gh completion -s zsh)"によって登録されてる補完関数が使用される
code: zsh
function _load_gh_completion() {
unfunction _gh_completion
eval "$(gh completion -s zsh)"
# 補完を実行
}
# compdef に登録
compdef _load_gh_completion gh
これを汎用化してon_demand_completion 'docker'、on_demand_completion 'gh' 'gh completion -s zsh'みたいに書けるようにした
先行研究